Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git使用from.gittributes确定文件类型和行尾的规则是什么?_Git - Fatal编程技术网

git使用from.gittributes确定文件类型和行尾的规则是什么?

git使用from.gittributes确定文件类型和行尾的规则是什么?,git,Git,当我有一个.gittributes文件时,我试图跟踪我的repo中的文件使用了什么规则。是否有一个git命令告诉您给定文件的类型文本与二进制和行尾是什么 为了理解我的请求,请考虑下面截断的GITActEx文件: 应如何处理以下文件以及应使用哪条规则?下面是我的猜测 test1.bat => Should match *.bat text eol=crlf WinBin\test1.bat => Should match WinBin/* text eol=crlf WinBin\te

当我有一个.gittributes文件时,我试图跟踪我的repo中的文件使用了什么规则。是否有一个git命令告诉您给定文件的类型文本与二进制和行尾是什么

为了理解我的请求,请考虑下面截断的GITActEx文件:

应如何处理以下文件以及应使用哪条规则?下面是我的猜测

test1.bat => Should match *.bat text eol=crlf
WinBin\test1.bat => Should match WinBin/* text eol=crlf
WinBin\test2.exe=> Should match WinBin/* text eol=crlf (but I'd rather it were binary)
scripts\test1.bat => Should match scripts/* text eol=lf
有很多资源描述git的终端如何工作以及各种问题。下面是我找到的一些

一些有用的链接 -Git属性文档页面

-描述为什么难以追踪git终端问题的精彩文章

那么问题

我的配置 我在windows上使用,我使用过git bash.exe和windows cmd.exe中的git;我也有

-显示属性信息

对于每个路径名,如果每个属性未指定、设置或未设置为该路径名上的gitattribute,则此命令将列出

您可能需要选项-a:

-显示属性信息

对于每个路径名,如果每个属性未指定、设置或未设置为该路径名上的gitattribute,则此命令将列出

您可能需要选项-a:


从技术上讲,属性处理程序被赋予一个文件名和来自所有不同.gittributes文件的规则列表,这些文件可以有多个。对于每个文件名:

该名称表示某个目录,例如,当名称为scripts/foo时,1该文件位于脚本目录中,因此该目录中的属性文件scripts/.gittributes优先,src/目录src/.gittributes中的.gittributes根本不适用

从优先级最低的文件开始,Git应用每一行来查看它是否匹配。如果匹配,则该行上的所有属性均适用。如果前一行设置了属性,则后一行将覆盖该属性。否则,早期的set属性仍然适用

Git对所有适用的属性文件重复此过程。由于较高优先级的应用较晚,因此它们的行将覆盖。这些文件的最后一行将覆盖前面的行

在本例中,在相同的.gittributes文件中有两行适用于scripts/test1.bat。因此,对于该文件:

*.bat text eol=crlf
scripts/* text eol=lf
第一行匹配并设置eol=crlf,然后第二行匹配并设置文本并设置eol=lf

结果是该特定文件的最终属性分组为:text set,eol=lf

您没有尝试将此作为示例,但假设您有一个名为scripts/a.exe的文件。有一句话:

*.exe binary
沿着这条路线:

scripts/* text eol=lf
因此,这里的组合似乎是二进制集、文本集和eol=lf。然而,二进制本身就是一个宏。虽然只能在某些属性文件中定义自己的宏。在本例中,宏将扩展为-diff-merge-text

每个-表示未设置。因此,在取消设置diff和merge的同时,第一个匹配行执行了一个取消设置的文本操作。第二个匹配行scripts/*执行了set text操作,该操作覆盖了先前的unset text操作。最终的结果是,对于这个文件,text被设置,diff被取消设置,merge被取消设置,eol被设置为lf

请注意,unset不同于unspecified。未指定的属性foo意味着没有一行显式地包含-foo或foo或foo=值。2除了预定义的宏和文档中调用的属性名称外,属性名称并不是一成不变的:Git的未来版本可能会添加新的,您可以设置或取消设置或设置您自己创建的属性名,Git不会对它们做任何说明。写作:

* foo=bar
没有效果,因为Git中目前没有任何内容查找foo属性,但是如果未来的Git决定使用foo来表示某种意义,它可能会突然开始做一些事情

处理所有这些都非常困难,这就是git check attr存在的原因。看

1Git在内部将所有反斜杠转换为正斜杠。您可能希望使用正斜杠,因为\b(例如)意味着返回到某些shell命令\t表示制表符,\r表示回车符,依此类推。如果您使用的是sh或bash,shell将对它们执行自己的操作,因此将它们保留给shell。不要在路径名中使用它们。使用正斜杠,反正打字更容易

2如果前一行设置、取消设置或将某些属性foo设置为某个值,则后一行可以使用!福。这将删除所有设置,并将foo恢复到未指定的状态。这与-foo完全不同,后者将foo置于未设置状态


并不是每个有意义的属性都实际使用了所有这些区别。

从技术上讲,所发生的是属性处理程序被赋予了一个文件名和来自所有变量的规则列表 gittributes文件可以有多个。对于每个文件名:

该名称表示某个目录,例如,当名称为scripts/foo时,1该文件位于脚本目录中,因此该目录中的属性文件scripts/.gittributes优先,src/目录src/.gittributes中的.gittributes根本不适用

从优先级最低的文件开始,Git应用每一行来查看它是否匹配。如果匹配,则该行上的所有属性均适用。如果前一行设置了属性,则后一行将覆盖该属性。否则,早期的set属性仍然适用

Git对所有适用的属性文件重复此过程。由于较高优先级的应用较晚,因此它们的行将覆盖。这些文件的最后一行将覆盖前面的行

在本例中,在相同的.gittributes文件中有两行适用于scripts/test1.bat。因此,对于该文件:

*.bat text eol=crlf
scripts/* text eol=lf
第一行匹配并设置eol=crlf,然后第二行匹配并设置文本并设置eol=lf

结果是该特定文件的最终属性分组为:text set,eol=lf

您没有尝试将此作为示例,但假设您有一个名为scripts/a.exe的文件。有一句话:

*.exe binary
沿着这条路线:

scripts/* text eol=lf
因此,这里的组合似乎是二进制集、文本集和eol=lf。然而,二进制本身就是一个宏。虽然只能在某些属性文件中定义自己的宏。在本例中,宏将扩展为-diff-merge-text

每个-表示未设置。因此,在取消设置diff和merge的同时,第一个匹配行执行了一个取消设置的文本操作。第二个匹配行scripts/*执行了set text操作,该操作覆盖了先前的unset text操作。最终的结果是,对于这个文件,text被设置,diff被取消设置,merge被取消设置,eol被设置为lf

请注意,unset不同于unspecified。未指定的属性foo意味着没有一行显式地包含-foo或foo或foo=值。2除了预定义的宏和文档中调用的属性名称外,属性名称并不是一成不变的:Git的未来版本可能会添加新的,您可以设置或取消设置或设置您自己创建的属性名,Git不会对它们做任何说明。写作:

* foo=bar
没有效果,因为Git中目前没有任何内容查找foo属性,但是如果未来的Git决定使用foo来表示某种意义,它可能会突然开始做一些事情

处理所有这些都非常困难,这就是git check attr存在的原因。看

1Git在内部将所有反斜杠转换为正斜杠。您可能希望使用正斜杠,因为\b(例如)意味着返回到某些shell命令\t表示制表符,\r表示回车符,依此类推。如果您使用的是sh或bash,shell将对它们执行自己的操作,因此将它们保留给shell。不要在路径名中使用它们。使用正斜杠,反正打字更容易

2如果前一行设置、取消设置或将某些属性foo设置为某个值,则后一行可以使用!福。这将删除所有设置,并将foo恢复到未指定的状态。这与-foo完全不同,后者将foo置于未设置状态


并非每个有意义的属性都使用了所有这些区别。

真棒的答案/解释。最好的祝愿。精彩的回答/解释。最美好的祝福。