158

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

4

3 回答 3

99

文档

.gitattributes(或.git/info/attributes)文件中的每一行的格式为:

pattern attr1 attr2 ...

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

做什么text=auto?从文档中:

当文本设置为“自动”时,路径被标记为自动行尾标准化。如果 Git 确定内容是文本,则在签入时将其行结尾规范化为 LF。

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

未指定

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

做什么core.autocrlf?从文档:

   core.autocrlf

将此变量设置为“true”与在所有文件上将文本属性设置为“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. 这不是一个有趣的调试。

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

于 2016-06-24T16:08:58.593 回答
69

它确保行尾被标准化。来源:Kernel.org

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

如果您想与强制行尾规范化的源代码管理系统进行互操作,或者您只想规范化存储库中的所有文本文件,则应将所有文件的文本属性设置为“自动”。

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

于 2014-01-31T05:31:09.340 回答
9

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

于 2014-01-31T05:29:16.980 回答