“text=auto”在.gitattributes文件中的作用是什么?

174

大多数.gitattributes文件都具有* text = auto。该文件中的text=auto有什么目的?

3个回答

115

来自文档

.gitattributes(或.git/info/attributes)文件中的每一行都是以下形式:

pattern attr1 attr2 ...
因此,在这里,模式是*,意味着所有文件,属性是text=autotext=auto表示什么意思?从文档中可以得知: 当设置text为“auto”时,路径会被标记为自动行尾规范化。如果Git决定内容是文本,则在提交时将其行尾规范化为LF。 如果没有启用,默认行为是什么? 未指定 如果未指定文本属性,则Git使用core.autocrlf配置变量来确定是否应转换该文件。 core.autocrlf是什么作用?来自文档:
   core.autocrlf

将此变量设置为“true”,几乎相当于在所有文件上将文本属性设置为“auto”,但是除了不能保证规范化的文本文件外,存储库中包含CRLF的文件不会被修改。如果您想要工作目录中具有CRLF行尾,即使存储库没有规范化的行尾,请使用此设置。

此变量可以设置为"input",在这种情况下,不执行任何输出转换。

如果你认为这很难理解,你并不孤单。

以下是我的话:* text=auto做了什么: 当有人提交一个文件时,Git会猜测该文件是否是文本文件,如果是,则会提交一个版本的文件,其中所有的CR + LF字节都将被替换为LF字节。它不会直接影响工作目录中文件的外观,当检出文件时,有其他设置会将LF字节转换为CR + LF字节。

建议:

不建议.gitattributes文件中放置* text=auto。相反,我建议类似于以下内容:

*.txt text
*.html text
*.css text
*.js text

这明确指定哪些文件是文本文件,并且在对象数据库中将CRLF转换为LF(但不一定在工作树中)。我们有一个带有* text=auto的仓库,而Git却错误地猜测了一个图像文件是文本文件,在对象数据库中用LF字节替换CR + LF字节,导致它损坏。这个问题调试起来很棘手。

如果必须使用* text=auto,请将其放在.gitattributes的第一行,以便后面的行可以覆盖它。这似乎已经成为越来越流行的做法。


4
为什么大家把LF称为“正常”,而不是CRLF?有没有相关的参考资料来证明这一点? - Yousha Aleayoub
1
如果你的“everyone”指的是“git-scm”,那可能是因为他们正在开发一个nix软件包,因此使用nix换行符是正常的。 - Justin Moh
10
LF被认为是“正常”的,因为它在许多开发工具中很常见。流行的开发工具如来自nix的git-scm。MacOS使用LF。只有Windows(仅考虑主流操作系统)使用CRLF。这使得在Windows上使用nix工具的开发人员以及交换文件时所有人都更加困难。另请参见为什么要使用CRLF - Roi Danton
3
@Flimm,请问一下 *.txt text=auto*.txt text 有什么区别?我原以为你上面的示例中所有的 4 行都应该是 text=auto,而不仅仅是文件扩展名后面的 text。例如 KiCad 器件封装文件(".kicad_mod" 扩展名)会在其 gitattributes 文件中使用这行代码进行归一化:*.kicad_mod text=auto (http://kicad-pcb.org/libraries/klc/G1.7/)。 - Gabriel Staples
5
不要混淆“规范化/规范化”和“正常”。 “规范化”意味着使其统一,“规范化”是相应的过程。 产生的统一状态称为“规范化”,而不是“正常”。 对于统一,需要选择(并坚持)某些约定。 Git的约定(针对对象数据库,而不一定针对工作目录)是LF行尾。请参阅“Mind the End of Your Line”博客文章。 - das-g
显示剩余8条评论

70

它确保规范化行尾。来源:Kernel.org

当文本设置为“auto”时,将对路径进行自动行尾规范化标记。如果git决定内容是文本,则其行尾在提交时会被规范化为LF。

如果您想与强制执行行尾规范化的源代码管理系统进行交互,或者您只想使存储库中的所有文本文件都规范化,请将text属性设置为“auto”以针对所有文件。

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


14
"Normalized line ending" 的意思是标准化的换行符。 - Fizer Khan
16
当一个文本文件被规范化时,它的行尾会在仓库中被转换为LF。 - Dave Zych
12
重要提示:这会覆盖你本地机器上的core.autocrlf设置,请查看@Daniel Jomphe在stackoverflow上的这个很棒的答案 - spankmaster79
2
如果 git 简单地不去 $%# 任何提交到仓库中的文件,那将是极好的。我曾经使用过 SLM、PerForce、MsBuild、Source Depot、TFS、SVM,这些工具都不会更改你的文件中的任何一个字节。在我的看法中,这是一种阴险的 git hack,它给我带来了很多痛苦。 - Vance McCorkle
1
结账时发生的只是故事的一半 - 在获取时会发生什么?在结账时,换行符是否仍保持为 LF,即使在 Windows 上也是如此? - Anthony
1
@spankmaster79,.gitattributes覆盖了core.autocrlf,而不是覆盖。 - M. Thompson

9

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