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

大部分.gitattributes文件都有* text=auto 。 那个文件中的text=auto的目的是什么?

它确保行结束正常化。 来源: Kernel.org

当文本设置为“自动”时,该path被标记为自动结束标准化。 如果git判定内容是文本,那么它的行尾就会在登记时被标准化为LF。

如果您想要与强制执行行尾标准化的源代码pipe理系统进行交互操作,或者只是希望将存储库中的所有文本文件进行规范化,则应该将文本属性设置为“自动”以便所有文件。

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

从文档 :

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

 pattern attr1 attr2 ... 

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

什么是text=auto ? 从文档:

当文本设置为“自动”时,该path被标记为自动结束标准化。 如果Git决定内容是文本,那么它的行结束在登记时被标准化为LF。

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

不明

如果文本属性未指定,Git使用core.autocrlfconfigurationvariables来确定文件是否应该被转换。

core.autocrlf做什么的? 从文档:

  core.autocrlf 

将该variables设置为“true”几乎与将text属性设置为“auto”在所有文件中几乎相同,只是文本文件不能保证被标准化:存储库中包含CRLF的文件将不会被触摸。 如果要在工作目录中拥有CRLF行结尾,即使存储库没有标准化的行结尾,也可以使用此设置。 该variables可以设置为input,在这种情况下,不执行输出转换。

如果你认为这一切都像泥巴一样清晰,你并不孤单。

下面是我的* text=auto当某人提交一个文件时,Git会猜测这个文件是不是文本文件,如果是,它将提交一个文件版本,其中所有CR + LF字节被replace与LF字节。 它不会直接影响工作树中的文件,在检出文件时还有其他设置会将LF字节转换为CR + LF字节。

build议:

不会推荐将* text=auto放在.gitattributes文件中。 相反,我会推荐这样的东西:

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

这明确指定哪些文件是文本文件,在对象数据库中(但不一定在工作树中)将CRLF转换为LF。 我们有一个* text=auto的回购,Git猜想图像文件是一个文本文件,导致它破坏了它,因为它用对象数据库中的LF字节replace了CR + LF字节。 这不是一个有趣的debugging。

如果您必须使用* text=auto ,则将其作为.gitattributes的第一行,以便后面的行可以覆盖它。 这似乎正在成为一种日益stream行的做法。

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