".gitattributes"文件中 "* text=auto eol=lf" 和 "* text eol=lf" 有什么区别?

3
这与这个问题非常相似:在.gitattributes中,`* text=auto`和`* text eol=lf`有什么区别? 但我特别想知道为什么我应该使用* text=auto eol=lf而不是* text eol=lf或者反过来呢?
据我所知,eol会覆盖text设置,那么使用前者有什么意义?有区别吗?如果有-是什么?
我现在正在阅读很多网站和Stack Overflow的问题/答案,但我仍然感到非常困惑。特别是当我看到这个更改时:https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L248 我觉得这个更改的措辞很难理解,现在我一无所知。请问有人能解释一下吗?
1个回答

10

Git内置了代码来检测文件是文本还是二进制。

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

Git默认使用此代码来决定是否在git diff检测到某个文件的更改时向您显示差异。 如果文件似乎是二进制的,Git会说“二进制文件不同”(默认情况下-您可以使其打印可用的差异,并且git format-patch强制执行该行为,例如)。 否则,该文件看起来是文本,因此您会得到常规差异。

Git还将此代码用于.gitattributes中的text = auto,但不适用于不带=autotext。 因此:

* text=auto eol=<whatever>

告诉Git:每次从索引中提取文件到工作树时,对文件应用检测代码。如果检测代码声称该文件是文本文件,则在将索引中的冷冻副本重新注入可用形式到工作树中时,应用行末转换。如果检测代码声称该文件是二进制文件,则不进行处理。1

相比之下,* text eol=<whatever> 告诉Git:每次将文件重新注入工作树时,应用行末转换。 Git版本2.10之前的错误是 * text=auto 意外地意味着 * text 而不是 * text=auto


1由于文本检测有时会(虽然不太常见)误判为(例如).jpg 图像文件,因此依赖于 text=auto 不明智。但它大多数时间都有效。


我终于明白为什么需要这么长的解释,因为幕后有太多事情要处理。如果你没有仔细阅读文档(就像我一样),那么很容易被压倒和困惑。感谢澄清! - Semmel
剩下的问题是你应该在什么情况下使用其中之一。我目前的理解是这完全取决于模式。* 当然非常广泛,因此更有可能捕获一些二进制文件。在这种情况下,您可能希望使用 text=auto 来保护免受二进制文件规范化的影响。在我的特定情况中,几乎没有二进制文件,因此我可以使用 * text eol=lf,并且我可以使用 *.resource binary 将任何非文本文件标记为二进制文件(在我的情况下为 *.resource)。但在大多数情况下,* text=auto eol=lf 是最好的选择。你同意吗? - Semmel
1
@Semmel:嗯...我避免使用Windows,因此不需要或希望我的版本控制系统干扰我的文件,这意味着我不需要或不想要任何这些。然而,在使用在Windows系统上使用的存储库(例如Git的Git存储库)时,我观察到其他人会明确调用每个文件扩展名和/或路径:他们从不让Git猜测文件是文本还是二进制文件。 - torek
这是你所提出的一个很好的观点。我有一个仓库,其中全部都是LF - 但偶尔会出现CRLF。只有在这种情况下 * text=auto eol=lf 可能是可行的 - 在每个其他设置中,我也会选择明确声明所有内容。 - Semmel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接