.gitattributes`文件中`text = auto`的目的是什么?


129

.gitattributes文件大多有* text=autotext=auto该文件的目的是什么?

Answers:


77

文档

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

pattern attr1 attr2 ...

所以这里的模式是*,表示所有文件,属性是text=auto

怎么text=auto办?从文档中:

当文本设置为“自动”时,将标记该路径以进行行尾自动归一化。如果Git决定内容为文本,则其行尾在签入时被标准化为LF。

如果未启用,默认行为是什么?

未指定

如果未指定text属性,则Git使用core.autocrlf配置变量来确定是否应转换文件。

怎么core.autocrlf办?从文档:

   core.autocrlf

将此变量设置为“ true”与将所有文件上的text属性设置为“ auto”几乎相同,除了不能保证文本文件被标准化:不会触碰存储库中包含CRLF的文件。即使您的存储库中没有标准化的行尾,也要在工作目录中使用CRLF行尾,请使用此设置。可以将此变量设置为输入,在这种情况下,不执行输出转换。

如果您认为这一切都像泥一样清澈,那么您并不孤单。

* text=auto用我的话来说就是这样:当有人提交文件时,Git会猜测该文件是否为文本文件,如果是,它将提交该文件的版本,其中所有CR + LF字节均被LF字节替换。它不会直接影响工作树中文件的外观,还有其他设置可以在签出文件时将LF字节转换为CR + LF字节。

建议:

建议把* text=auto.gitattributes文件。相反,我会建议这样的事情:

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

这明确指定了哪些文件是文本文件,这些文件在对象数据库中(但不一定在工作树中)将CRLF转换为LF。我们使用进行了回购* text=auto,并且Git猜测图像文件是文本文件是错误的,导致它损坏了它,因为它用对象数据库中的LF字节替换了CR + LF字节。那不是一个好玩的调试程序。

如果必须使用* text=auto,请将其放在中的第一行.gitattributes,以便以后的行可以覆盖它。这似乎正在变得越来越流行。


2
为什么每个人都将LF称为“普通”而不是CRLF?有什么证明吗?
Yousha Aleayoub

1
@YoushaAleayoub是什么意思?
Flimm

1
@YoushaAleayoub(如果您everyone引用)git-scm,可能是因为他们正在开发* nix包,因此使用* nix换行符是正常的
贾斯汀·莫

4
@YoushaAleayoub LF被认为是“普通”的b / c,在许多开发工具中都很常见。流行的开发工具,例如git-scm来自* nix的工具。MacOS使用LF。只有Windows(仅考虑主流OS)在使用CRLF。这使得开发人员在Windows上使用* nix工具以及在交换文件时的每个人都更加困难。另请参阅为什么选择CRLF
Roi Danton

2
@Flimm,你能解释的区别*.txt text=auto*.txt text好吗?我认为以上示例中的所有4行都应该是text=auto,而不仅仅是text文件扩展名之后。例如,KiCad足迹文件(扩展名为“ .kicad_mod”)在其gitattributes文件中使用以下行进行标准化:*.kicad_mod text=autokicad-pcb.org/libraries/klc/G1.7)。
加布里埃尔·斯台普斯

64

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

当文本设置为“自动”时,将标记该路径以进行行尾自动归一化。如果git决定内容为文本,则其行尾在签入时标准化为LF。

如果要与强制执行行末尾标准化的源代码管理系统进行互操作,或者只是想对存储库中的所有文本文件进行标准化,则应将所有文件的text属性设置为“ auto”。

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


12
您是指规范化的行尾?
费扎尔汗

14
When a text file is normalized, its line endings are converted to LF in the repository.
Dave Zych

11
重要的是要知道,这会覆盖计算机上的本地core.autocrlf设置。@Daniel Jomphe
spankmaster79 2015年

1
如果git只是不将任何文件检入到存储库中,而git只是没有$%#那就太好了。我“VE与SLM,Perforce的,的MSBuild,源仓库,TFS,SVM工作,没有这些将改变在任何文件甚至一个字节这是一个阴险的git黑客IMO,它给我带来了很多痛苦。
万斯·麦考克尔(Vance McCorkle)

1
结帐时发生的事情只是故事的一半-收到时发生什么?可以说在结帐时LF,即使在Windows 上,行尾仍为,是否正确?
安东尼

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.