gitattributes中的`*text = auto eol = lf`会怎样?

Bor*_*ard 28 git gitattributes

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

* text=auto eol=lf
Run Code Online (Sandbox Code Playgroud)

我想准确理解这是做什么的.

第一部分是text=auto.从文档:

这确保了Git认为是文本的所有文件都将在存储库中具有规范化(LF)行结尾.

重要的是,Git仅针对它检测为文本文件的文件进行规范化.

但是,我不确定这个eol=lf部分.我认为它也将仅对文本文件进行规范化,但我在文档中找不到对它的支持,并且当我们的PNG文件也被标准化时我们有一个实例,使它们无效.

是否有像上面这样的设置基本上会说"在文本文件的两个方向上进行规范化,并单独保留二进制文件"?

Bor*_*ard 21

Git 2.10解决了这个问题,现在表现得像预期的那样.


Bor*_*ard 14

答案是否定的,Git目前(截至2.3)无法通过自动检测二进制和文本格式来执行结帐EOL转换,因此它只处理文本.解决方法是eol=lf仅指定所选文件类型(例如*.txt),或者相反,使用例如将某些文件类型标记为二进制*.png binary.

相关:Git邮件列表上的功能提议


* text=auto

这将正确标准化repo中的文本文件.但是,今天无法轻松实现第二部分(LF强制结账),因为添加eol=lf将不幸地处理二进制文件.今天唯一的解决方案是标记某些类型以进行转换(例如 *.txt eol=lf),或者相反地将某些类型标记为二进制(例如 *.png binary).

这两者都存在同样的问题:必须在.gitattributes文件中明确列出特定的文件类型,这意味着必须提前知道类型,或者.gitattributes每次出现新文件类型时所有开发人员都必须记住更新文件该项目.他们不会.

  • 这在现代 Git 版本中已得到修复。Ubuntu 18.04 和 20.04 中的版本可以正常工作。 (3认同)

小智 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说明了这些文件应该在您的工作树中是什么,即在签出 git 通过该部分自动检测为文本的文件后,它们应该如何在您的文件系统本地显示* text=auto

是否有像上面这样的设置基本上会说“对文本文件进行两个方向的标准化,并保留二进制文件”?

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

* text=auto eol=lf
*.bat text eol=crlf
*.cmd text eol=crlf
*.ahk text eol=crlf
Run Code Online (Sandbox Code Playgroud)

  • "* text=auto eol=lf 的行为与 git config core.autocrlf false " 我不认为这个说法是正确的。当 autocrlf 设置为 false 时,git 实际上根本不关心行结尾。您将能够将 LF、CR 以及 CRLF 推送到您的存储库中,无需进行任何转换。将 autocrlf 设置为 true 后,您的工作目录中将包含 CRLF,但只有 LF 会被推入存储库本身。如果我错了,请纠正我,我现在正在努力自己掌握这个主题。 (2认同)