‘ text = auto‘ in‘ . gitproperties’文件的用途是什么?

大多数 .gitattributes文件都有 * text=autotext=auto在这个文件中的作用是什么?

54778 次浏览

这种配置是关于如何处理行结尾的。当启用时,所有行结尾都会在存储库中转换为 LF。还有其他标志来处理行结尾在工作目录中的转换方式。关于这个问题的全部信息请点击这里: Https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html

它确保行结束标准化。来源: Kernel.org

当文本设置为“ auto”时,路径将被标记为自动行尾规范化。如果 git 决定内容是文本,那么它的行结尾在签入时被标准化为 LF。

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

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

来自 那些文件:

.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”几乎相同,只是不能保证文本文件是“ 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中的第一行,以便后面的行可以覆盖它。这似乎正在成为一种越来越流行的做法。