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

Fiz*_*han 122 git gitattributes

大部分.gitattributes文件都有* text=auto.text=auto该文件的目的是什么?

Fli*_*imm 67

来自文档:

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

pattern attr1 attr2 ...
Run Code Online (Sandbox Code Playgroud)

所以在这里,模式是*,这意味着所有文件,属性是text=auto.

怎么text=auto办?从文档:

当文本设置为"auto"时,路径将标记为自动行结束标准化.如果Git决定内容是文本,则其行结尾在签入时标准化为LF.

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

不明

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

怎么core.autocrlf办?来自文档:

   core.autocrlf
Run Code Online (Sandbox Code Playgroud)

将此变量设置为"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
Run Code Online (Sandbox Code Playgroud)

这明确指定哪些文件是文本文件,这些文件在对象数据库中将CRLF转换为LF(但不一定在工作树中).我们有一个repo * text=auto,并且Git认为它是一个文本文件的图像文件是错误的,导致它破坏它,因为它在对象数据库中用LF字节替换了CR + LF字节.这不是一个有趣的调试.

如果必须使用* text=auto,请将其作为第一行.gitattributes,以便后面的行可以覆盖它.这似乎正在成为越来越受欢迎的做法.

  • @YoushaAleayoub LF被认为是"普通"b/c,它在许多开发工具中很常见.流行的开发工具,如来自*nix的`git-scm`.MacOS使用LF.只有Windows(仅考虑主流操作系统)正在使用CRLF.这使得开发人员在Windows上使用*nix工具以及在交换文件时对每个人都更难.另请参阅[为什么选择CRLF](/sf/ask/456517981/). (3认同)
  • @YoushaAleayoub 不要将“标准化”/“标准化”与“正常”混淆。“归一”就是统一,“归一”就是相应的过程。由此产生的统一状态称为“标准化”,而不是“正常”。为了统一,人们必须选择(并遵守)某种约定。Git 的约定(对于_对象数据库_,不一定对于工作目录)是“LF”行结尾。请参阅[注意行尾](https://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/) 博客文章。 (3认同)
  • 为什么每个人都将LF称为“普通”而不是CRLF?有什么证明吗? (2认同)
  • @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 /). (2认同)

Dav*_*ych 61

它确保线路结束标准化.资料来源:Kernel.org

当文本设置为"auto"时,路径将标记为自动行结束标准化.如果git决定内容是文本,则其行结尾在签入时标准化为LF.

如果要与强制执行行尾规范化的源代码管理系统进行互操作,或者只是希望对存储库中的所有文本文件进行规范化,则应将所有文件的text属性设置为"auto".

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

  • 你的意思是归一化线的结束? (12认同)
  • `当文本文件被规范化时,其行结尾将在存储库中转换为LF (12认同)
  • 重要的是,这会覆盖机器上的本地core.autocrlf设置,请参阅[@Daniel Jomphe的这个很棒的答案](http://stackoverflow.com/questions/170961/whats-the-best-crlf-carriage-return-换行装卸策略与 - GIT) (11认同)
  • 如果 git 没有将任何文件签入到存储库中,那就太棒了。我曾与 SLM、PerForce、MsBuild、Source Depot、TFS、SVM 合作过,这些都不会改变任何文件中的一个字节。这是一个阴险的 git hack IMO,它给我带来了很多痛苦。 (2认同)

Kar*_*ler 7

该配置是关于如何处理行结尾的.启用后,所有行结尾都将转换为存储库中的LF.还有其他标志可以处理在工作目录中如何转换行结尾.关于这个问题的完整信息,请访问:https: //www.kernel.org/pub/software/scm/git/docs/gitattributes.html