大多数.gitattributes
文件都有* text=auto
。该文件中text=auto
的目的是什么?
答案 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