为什么 .gitattributes 不会覆盖 Linux 上的 core.autocrlf 配置?

eve*_*tic 8 git line-endings eol carriage-return linefeed

在为项目设置 Git 时,我注意到行尾规范化在 Linux 和 Windows 上的工作方式略有不同。

据我了解有关此主题的 Git 文档,Windows 上的行为是正确的。具体来说,当.gitattributes文件存在时,它应该覆盖core.autocrlf设置。

下表显示了我所做的一些实验的结果。最左边的两列显示.gitattributes文件和core.autocrlf设置。其他列显示以下git命令的结果:

  1. git rm --cached <file> (强制下一次结帐以执行行规范化处理)。
  2. git checkout HEAD -- <file> (签出文件,应用行结束规范化)
  3. git ls-files --eol <file> (检查工作树中的行尾)
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| .git 属性 | core.autocrlf | Linux 2.7.2 | Linux 2.11.0 | Linux 2.16.2 | Windows 2.12.2.windows.2 | Windows 2.16.1.windows.1 |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| 无 | 真实| 带crlf | 带crlf | 带crlf | 带crlf | 带crlf |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| 无 | 假| 带我 | 带我 | 带我 | 带我 | 带我 |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| * 文本=自动 | 真实| 带crlf | 带crlf | 带crlf | 带crlf | 带crlf |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| * 文本=自动 | 假| 带我 | 带我 | 带我 | 带crlf | 带crlf |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| * 文本=自动 | 真实| 带crlf | 带crlf | 带crlf | 带crlf | 带crlf |
| 测试文本 | | | | | | |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+
| * 文本=自动 | 假| 带我 | 带我 | 带我 | 带crlf | 带crlf |
| 测试文本 | | | | | | |
| | | | | | | |
+----------------+---------------+-------------+-- ------------+--------------+-------------- ----+----------------------------+

如您所见,在 Linux 上core.autocrlf,即使存在.gitattributes文件,这些设置似乎也有效。

我需要一些帮助来确定这是否真的是一个错误。

Mar*_*ger 2

看来误解来自于将文本属性解释为与 autocrlf 配置设置相同的含义。

\n

来自gitattributes文档(https://git-scm.com/docs/gitattributes):

\n
\n

该属性启用并控制行尾标准化。当文本文件被规范化时,其行结尾在存储库中被转换为 LF。要控制工作目录中使用的行结束样式,请对单个文件使用 eol 属性,对所有文本文件使用 core.eol 配置变量。请注意 core.autocrlf 会覆盖 core.eol

\n
\n

(强调是添加的。)

\n

因此,如果您想使用属性来控制工作树中的行结尾,则需要设置 eol 属性(而不仅仅是文本属性)。

\n

事实上,有几个属性和几个配置选项涉及如何处理行结尾,并且Windows 和 *nix 之间的默认行为存在差异(根据设计)。来自git config文档(https://git-scm.com/docs/git-config):

\n
\n

核心文件

\n

设置当 core.autocrlf 为 false 时设置了 text 属性的文件在工作目录中使用的行结束类型。替代方案是 lf、crlf 和 native,它们使用 platform\xe2\x80\x99s 本机行结尾。默认值是本机

\n
\n

因此,回答您的问题:不,您所描述的不是错误。

\n