.gitattributes中的“ * text = auto eol = lf”和“ * text eol = lf”之间有什么区别?

时间:2019-07-02 18:09:03

标签: git gitattributes

这与以下问题非常相似: What is the differrence between `* text=auto` and `* text eol=lf` in .gitattributes?

但是我特别问为什么我应该在string上使用* text=auto eol=lf,反之亦然?

据我了解,* text eol=lf会覆盖eol设置,那么使用前者有什么意义呢?有区别吗?如果是这样-怎么办?

我现在正在阅读许多网站和Stack Overflow问题/答案-但我仍然非常困惑。特别是当我看到此更改时:https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L248

我很难理解更改的措辞,以至于我现在都不是更明智的选择。有人可以对此有所说明吗?

1 个答案:

答案 0 :(得分:1)

Git中有代码可以检测文件是文本文件还是二进制文件。

如果文件的前面有很多零(ASCII NUL)字节,则该文件被视为二进制文件。其他一些二进制模式也是如此。

默认情况下,当git diff检测到某个文件中的某些更改时,Git使用此代码来决定是否显示差异。如果该文件看起来是二进制文件,则Git会说“二进制文件不同”(默认情况下,您可以使它显示可用的差异,例如git format-patch会强制执行该行为)。否则,该文件似乎是文本文件,因此您需要定期添加差异。

Git 还将此代码用于text=auto中的.gitattributes,但 not 则用于text-无-{{1} }。所以:

=auto

告诉Git:每次将文件从索引提取到工作树时,都将检测代码应用于文件。如果检测代码声称该文件是文本文件,则在将文件的冻干副本从索引重新水化为工作树中的可用形式时,应用行末转换。如果检测代码声称该文件是二进制文件,则将其保留。 1

相反,* text=auto eol=<whatever> 告诉Git:每次将文件补水到工作树中时,都要应用行尾转换。 2.10版之前的Git中的错误是{ {1}}偶然是* text eol=<whatever>而不是* text=auto的意思。


1 由于文本检测有时(尽管不是很经常)在(例如)* text个图像文件上失灵,因此依赖 * text=auto。但这在大多数时间都是有效的。