大多数 .gitattributes文件都有 * text=auto。 text=auto在这个文件中的作用是什么?
.gitattributes
* text=auto
text=auto
这种配置是关于如何处理行结尾的。当启用时,所有行结尾都会在存储库中转换为 LF。还有其他标志来处理行结尾在工作目录中的转换方式。关于这个问题的全部信息请点击这里: Https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
它确保行结束标准化。来源: Kernel.org
当文本设置为“ auto”时,路径将被标记为自动行尾规范化。如果 git 决定内容是文本,那么它的行结尾在签入时被标准化为 LF。 如果您希望与强制执行行尾规范化的源代码管理系统进行互操作,或者您只是希望对存储库中的所有文本文件进行规范化,那么您应该将所有文件的 text 属性设置为“ auto”。 这样可以确保 git 认为是文本的所有文件在存储库中都有规范化(LF)行结尾。
当文本设置为“ auto”时,路径将被标记为自动行尾规范化。如果 git 决定内容是文本,那么它的行结尾在签入时被标准化为 LF。
如果您希望与强制执行行尾规范化的源代码管理系统进行互操作,或者您只是希望对存储库中的所有文本文件进行规范化,那么您应该将所有文件的 text 属性设置为“ auto”。
这样可以确保 git 认为是文本的所有文件在存储库中都有规范化(LF)行结尾。
来自 那些文件:
.gitattributes(或 .git/info/attributes)文件中的每一行的格式如下:
.git/info/attributes
pattern attr1 attr2 ...
这里的模式是 *,意思是所有文件,属性是 text=auto。
*
text=auto是做什么的:
当文本设置为“ auto”时,路径将被标记为自动行尾规范化。如果 Git 决定内容是文本,那么它的行结尾在签入时被标准化为 LF。
如果没有启用,默认行为是什么?
未指明 如果 text 属性未指定,Git 将使用 core.autocrlf 配置变量来确定是否应该转换文件。
未指明
如果 text 属性未指定,Git 将使用 core.autocrlf 配置变量来确定是否应该转换文件。
core.autocrlf是做什么的:
core.autocrlf
core.autocrlf 将这个变量设置为“ true”与将所有文件的 text 属性设置为“ auto”几乎相同,只是不能保证文本文件是“ auto” 规范化: 不触及存储库中包含 CRLF 的文件。使用此设置,如果你想有 CRLF 行结束在您的工作 即使存储库没有规范化的行结束符,也可以将。 可以将此变量设置为输入,在这种情况下不执行输出转换。
将这个变量设置为“ true”与将所有文件的 text 属性设置为“ auto”几乎相同,只是不能保证文本文件是“ 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中的第一行,以便后面的行可以覆盖它。这似乎正在成为一种越来越流行的做法。