`* text=auto eol=lf` 在 gitattributes 中的作用是什么?

49

我们的.gitattributes文件中有这个:

* text=auto eol=lf

我想确切地了解这个代码段的作用。

第一部分是 text=auto。从文档中可以看到:

这确保了所有由Git视为文本文件的文件在存储库中具有规范化(LF)的行结尾。

重要的是,Git仅对其检测为文本文件的文件进行规范化。

然而,我不确定 eol=lf 部分的作用。我认为它也只对文本文件进行规范化,但我在文档中找不到相关支持,并且我们曾经出现过PNG文件也被规范化的情况,导致它们无效。

是否存在类似上述设置,可以基本上表示“对文本文件进行双向规范化,而将二进制文件保持不变”?

3个回答

44

我的Git客户端版本是2.9.15,升级到最新的2.15版本解决了我的问题。谢谢。 - Nounours

20
答案是否定的,Git当前(截至2.3版本)无法自动检测二进制和文本格式并进行EOL转换,以处理仅为文本的文件。解决方法是仅对某些文件类型(例如*.txt)指定eol=lf,或者反过来,使用例如*.png binary将某些文件类型标记为二进制。
相关内容:Git邮件列表上的功能建议

* text=auto

这将正确地规范化版本库中的文本文件。但是,现在很难实现第二部分(强制使用LF检出),因为添加eol = lf将不幸地处理二进制文件。目前唯一的解决方案是标记某些类型进行转换(例如* .txt eol = lf )或反过来,将某些类型标记为二进制文件(例如* .png binary )。

这两种方法都面临同样的问题:必须在.gitattributes文件中明确列出特定文件类型,这意味着要么必须提前知道这些类型,要么所有开发人员都必须记住每次项目中出现新文件类型时更新.gitattributes文件。他们不会这样做。


3
这个问题在现代的Git版本中已经被修复。Ubuntu 18.04和20.04版本可以正常工作。 - Aaron Franke

7
这个答案是为其他像我一样偶然发现此处的人准备的。
截至Git 2.10,这个方法可以正常工作,下面的内容只适用于2.10版本(通过git --version检查版本)。 Git 2.10发布说明中相关片段 * text=auto eol=lf的行为类似于git config core.autocrlf false * text=auto eol=crlf的行为类似于git config core.autocrlf true

这确保了Git认为是文本文件的所有文件都具有规范化(LF)行尾。

在引用中提到的lf是指将文件添加到索引时发生的情况(最终推送到上游)。附加的eol=xx表示这些文件应该在你的工作树中,即它们在通过* text=auto部分自动检测到的文本文件检出后,在本地文件系统上如何显示。

是否有像上面那样的设置,基本上会说“对文本文件进行双向规范化,不要动二进制文件”?

两者都可以,但我个人在.gitattributes文件中使用以下设置。顺序很重要。

* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.ahk text eol=crlf

2
“* text=auto eol=lf behaves as git config core.autocrlf false” 我认为这个说法不正确。当 autocrlf 设置为 false 时,git 实际上根本不关心行尾符。你可以将 LF、CR 和 CRLF 推送到你的存储库中,而不需要进行任何转换。当 autocrlf 设置为 true 时,你的工作目录中会有 CRLF,但是只有 LF 会被推送到存储库本身。如果我错了,请纠正我,因为我现在正在努力理解这个主题。 - Nefiji
@Nefiji: 当 autocrlf 设置为 false 时,行为由每个文件的有效文本属性和 eol 设置所控制。当 autocrlf 设置为 true 时,Git 的行为就像所有文件都设置为 text=auto 和 eol 设置为 "crlf"。也就是说,它通过检查文件内容执行文本文件的自动检测,然后对于被检测为文本的文件在工作目录中使用 CRLF。 - nmatt

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