“* text=auto”和“* text=auto eol=lf”有什么区别?

What is the difference between "* text=auto" and "* text=auto eol=lf"?

我正在阅读有关 .gitattributes 文件和强制以 some tutorials it's written like * text=auto and in some others 结尾的规则,就像文件第一行的 * text=auto eol=lf

有什么区别吗?第一个到底是做什么的?它甚至会强制任何行结尾吗?

some repositories 中还提到 * text=auto 预制 LF 归一化!不知道是不是真的

这些属性之间存在差异。 text 要求 Git 执行行尾转换。任何时候 Git 这样做,它都会将 LF 结尾存储在存储库中,并且当它在工作树中签出文件时会转换它们。 text=auto 要求 Git 在文件的开头搜索一个 NUL 字节,如果找到一个,则该文件是二进制文件并且不执行转换;否则,文件为文本,并执行转换。这在大多数情况下通常都可以正常工作,并且是一个合理的默认设置。

默认情况下,Git 遵循几个配置变量来决定工作树中应使用哪种行结束转换(LF 或 CRLF),除非 eol 属性已设置。如果设置了 eol,则 (a) 文件会自动设置为 text 并且 (b) 始终使用该行结尾。

所以在前一种情况下,* text=auto 说,“猜猜这是否是一个文本文件,如果是,请使用用户首选的行结尾来检查这个文件。”从 Git 2.10 开始,eol=lf 仅适用于在这种情况下被猜测为 text 的文件。通常,如果 text 被显式设置,text=auto 被设置并且文件被检测为文本,或者如果 text 未指定,则 eol 适用;在 Git 2.10 及更新版本中,它不会影响明确标记为 -text 或使用 text=auto.

检测为二进制的文件

但是,如果您使用的是旧版本的 Git,这可能会导致一些二进制文件被错误处理,因为它会强制它们始终为文本。如果您的存储库仅包含文本文件,那么它可以工作,但最好写成 * text eol=lf。否则,您可以分别指定不同类型的文件:

* text=auto
*.c text
*.jpg -text
*.sh text eol=lf
*.bat text eol=crlf

以上将 shell 文件设置为 LF,因为它们是工作所必需的,对于具有 CRLF 结尾的批处理文件也是如此。 JPEG 文件不会有任何转换,因为它们是二进制文件。