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

时间:2014-01-31 05:22:50

标签: git gitattributes

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

3 个答案:

答案 0 :(得分:56)

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

  

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

     

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

     

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

答案 1 :(得分:55)

来自the docs

  

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

pattern attr1 attr2 ...

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

text=auto做什么?来自文档:

  

当文本设置为“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 :(得分:7)

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