1

这本质上是对这里提出的关于配置之间* text=auto* text=auto eol=lf中的区别的问题的后续行动: “* text=auto”和“* text=auto eol=lf”之间的区别是什么?.gitattributes

我想我了解 Git 的工作原理,但我想确认一下,因为文档令人困惑。

text属性状态的文档:

此属性启用和控制行尾标准化。当一个文本文件被规范化时,它的行尾在存储库中被转换为 LF。要控制工作目录中使用的行尾样式,请对单个文件使用 eol 属性,对所有文本文件使用 core.eol 配置变量。请注意,将 core.autocrlf 设置为 true 或 input 会覆盖 core.eol(请参阅 git-config [1] 中这些选项的定义)。

因此,如果您使用 Git,这听起来像是LF默认强制执行* text=auto,从而变得* text=auto eol=lf多余。

然而,引用的第二个粗体部分让我感到困惑:Git 是否尊重core.autocrlfcore.eol?我使用 PowerShell 和 Git 2.16.1 在 Windows 机器上对此进行了测试:

  1. 运行git config --global core.autocrlf falsegit config --global core.eol crlf。后者不是您通常想要的,但对于这个实验来说,看看 Git 是否完全接受它是很有用的。
  2. 使用记事本创建具有多行内容的文本文件。该文件应该有CRLF行尾。
  3. 在同一目录中初始化一个 Git 存储库。
  4. 将文件添加到 Git 的索引中。
  5. 运行git ls-files --eol并观察文件CRLF在索引和工作树中都有。
  6. 添加一个.gitattributes带有* text = auto. 提交它。
  7. 运行git add --renormalize .以重新规范化先前提交的文件。
  8. 运行git status。观察该文件已被暂存以供提交。
  9. 提交文件后,运行git ls-files --eol以观察文件现在LF在索引中使用。

因此,尽管我设置core.eol=crlf并关闭了core.autocrlf,Git 仍然强制执行LF行尾。

问题:文档是否具有误导性?会text=auto一直强制执行LF吗?

4

1 回答 1

0

我想我想通了:

  • core.autocrlf并且core.eol仅影响工作树中的行尾,而不影响 Git 的索引(在启用规范化时将始终使用LF)或代码的远程副本。因此 的输出git ls-files --eol

  • eol属性中的蕴含.gitattributestext这意味着它LF在索引和您eol在工作目录中设置的任何值中强制执行。示例:eol=crlf暗示index = LFworking tree = CRLF

因此,文档有点误导,因为text=auto它不依赖core.autocrlfcore.eol- 它总是强制LF索引的行尾。core.autocrlf除非您配置、core.eol或使用该eol属性,否则工作树中的行尾将保持原样。

于 2022-01-11T17:54:50.443 回答