【发布时间】:2022-01-11 12:29:32
【问题描述】:
这本质上是对此处提出的关于.gitattributes 配置中* text=auto 和* text=auto eol=lf 之间区别的问题的后续:What is the difference between "* text=auto" and "* text=auto eol=lf"?
我想我了解 Git 的工作原理,但我想确认一下,因为文档很混乱。
The docs for the text attribute 状态:
此属性启用和控制行尾标准化。当一个文本文件被规范化时,它的行尾被转换为存储库中的 LF。要控制工作目录中使用的行尾样式,对单个文件使用 eol 属性,对所有文本文件使用 core.eol 配置变量。请注意,将 core.autocrlf 设置为 true 或 input 会覆盖 core.eol(请参阅 git-config[1] 中这些选项的定义)。
所以听起来如果你使用* text=auto,Git 默认会强制执行LF,从而使* text=auto eol=lf 变得多余。
但是,引用的第二个粗体部分让我感到困惑:Git 是否尊重core.autocrlf 或core.eol?我使用 PowerShell 和 Git 2.16.1 在 Windows 机器上对此进行了测试:
- 运行
git config --global core.autocrlf false和git config --global core.eol crlf。后者不是你通常想要的,但对于这个实验来说,看看 Git 是否完全接受它是很有用的。 - 使用记事本创建包含多行内容的文本文件。该文件应该有
CRLF行结尾。 - 在同一目录中初始化一个 Git 存储库。
- 将文件添加到 Git 的索引中。
- 运行
git ls-files --eol并观察文件在索引和工作树中都有CRLF。 - 添加带有
* text = auto的.gitattributes文件。提交。 - 运行
git add --renormalize .重新规范化之前提交的文件。 - 运行
git status。观察文件已被暂存以供提交。 - 提交文件后,运行
git ls-files --eol观察文件现在在索引中使用LF。
所以尽管我设置了core.eol=crlf 并关闭了core.autocrlf,Git 仍然强制LF 用于行尾。
问题:文档是否具有误导性? text=auto 是否会始终强制执行 LF?
【问题讨论】:
标签: git newline line-endings core.autocrlf lf