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

Ami*_*mir 4 git eol gitattributes

我正在阅读有关该.gitattributes文件和强制行结尾的规则,在一些教程中它的写法* text=auto其他教程类似,就像* text=auto eol=lf在文件的第一行一样。

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

另外,在一些存储库中,提到了* text=auto执行 LF 归一化!我不知道这是真的还是假的。

bk2*_*204 5

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

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

因此,在前一种情况下,* text=auto“猜测这是否是一个文本文件,如果是,则使用用户首选的行结尾检查此文件。” 从 Git 2.10 开始,这只eol=lf适用于本例中猜测的文件。text一般来说,eol如果text显式设置、text=auto设置且文件被检测为文本,或者text未指定,则适用;在 Git 2.10 及更高版本中,它不会影响-text使用text=auto.

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

* text=auto
*.c text
*.jpg -text
*.sh text eol=lf
*.bat text eol=crlf
Run Code Online (Sandbox Code Playgroud)

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