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

4
我正在阅读关于.gitattributes文件和强制行结尾规则的一些教程。在一些教程中,它被写成* text=auto,而在其他一些教程中,则是* text=auto eol=lf,写在文件的第一行。

这两种写法有什么区别?第一种具体做了什么?它是否强制任何行结尾?

另外,在一些代码库中,提到* text=auto执行LF规范化!我不知道这是否属实。


请参见以下链接:https://dev59.com/I6Xja4cB1Zd3GeqPVbqy#46592252 和 https://dev59.com/DrTna4cB1Zd3GeqPBNyO#56858538,这些内容与gitattributes的text auto eol lf有关。 - phd
1个回答

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

上面的命令将shell文件设置为LF,因为这是它们正常工作所必需的,而批处理文件需要具有CRLF结尾。JPEG文件不需要进行任何转换,因为它们是二进制文件。

在后一种情况下,text=auto被忽略,所有文件都是文本文件,并且在工作树中以及在仓库中都有LF结尾。这是否适用于现代git版本?我经常看到引用此更改日志,其中建议text=auto eol=whatever不会覆盖text的“auto”值:https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L248 - Aleksandr Hovhannisyan
这份文档中说到eol,“它使得行末转换无需进行任何内容检查,实际上是设置了文本属性。” 可能行为已经改变,但所记录的行为就是我所指定的。 - bk2204
没错,但需要注意的是自 Git 2.10 起,在执行 text=auto eol=lf 命令时,text=auto 不再被忽略。(它最终只是多余的。) - Aleksandr Hovhannisyan
1
我已根据在Git中添加测试所发现的行为更新了文本。我很快就会将该测试和补丁发送到上游。 - bk2204
1
* text=auto 允许用户使用 core.autocrlfcore.eol 指定结尾。 * text=auto eol=lf 将始终使用 LF 结尾。 在任何情况下都不会修改二进制文件。 是的,我将要推送的分支在 这里 - bk2204
显示剩余2条评论

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