【问题标题】:Does text=auto in .gitattributes always enforce LF line endings and ignore Git's core.autocrlf and core.eol settings?.gitattributes 中的 text=auto 是否总是强制执行 LF 行结尾并忽略 Git 的 core.autocrlf 和 core.eol 设置?
【发布时间】: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 机器上对此进行了测试:

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

所以尽管我设置了core.eol=crlf 并关闭了core.autocrlf,Git 仍然强制LF 用于行尾。

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

【问题讨论】:

    标签: git newline line-endings core.autocrlf lf


    【解决方案1】:

    我想我明白了:

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

    • .gitattributes 中的eol 属性暗示text,这意味着它强制索引中的LF 以及您在工作目录中为eol 设置的任何值。示例:eol=crlf 暗示 index = LF 和 working tree = CRLF。

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

    【讨论】:

    • 这不太正确:bk2204 指出 eol=lf 或 eol=crlf 强制 text 完全设置(不仅仅是设置为自动):请参阅 this question。显然,这种行为在 Git 2.9 和 2.10 之间发生了变化。
    • 嗯:根据发行说明,* text=auto eol=lf 在 Git 2.9 更早版本中的意思是 * text eol=lf,但在 2.10 及更高版本中不再如此,因此这被认为是一个错误。由于您使用的是 Git 2.16,因此大概不会出现此错误。
    • 在任何情况下,if 文件 is 被检测为文本,eol= 设置确实总是将索引副本标准化为具有 LF-只是,正如你所说。但是,如果 Git 确定文件是二进制文件,则不会调整索引副本。
    • @torek 对,我主要关心现代 Git 版本。按照我的理解,eol 意味着text。每当使用text 时,索引中的行尾将变为LF。如果text=auto(带有或不带有eol 属性),Git 将使用其自动检测算法仅将此规范化应用于文本文件。那么eol的主要作用就是改变工作目录中的行尾。
    • =auto 不依赖 core.autocrlf 或core.eol,它推迟 给他们。 core.eol 仅在结帐时使用,并且仅在 core.autocrlf=false 或未设置时使用。
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 2015-03-24
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2017-01-17
    • 2015-06-08
    相关资源
    最近更新 更多