【问题标题】:Why does .gitattributes not override core.autocrlf configuration on Linux?为什么 .gitattributes 不会覆盖 Linux 上的 core.autocrlf 配置?
【发布时间】:2018-08-15 11:52:37
【问题描述】:

在为项目设置 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 属性 |核心.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 | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+ |无 |真实 | w/crlf | w/crlf | w/crlf | w/crlf | w/crlf | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+ |无 |假 | w/lf | w/lf | w/lf | w/lf | w/lf | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+ | *文本=自动|真实 | w/crlf | w/crlf | w/crlf | w/crlf | w/crlf | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+ | *文本=自动|假 | w/lf | w/lf | w/lf | w/crlf | w/crlf | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+ | *文本=自动|真实 | w/crlf | w/crlf | w/crlf | w/crlf | w/crlf | |测试文本 | | | | | | | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+ | *文本=自动|假 | w/lf | w/lf | w/lf | w/crlf | w/crlf | |测试文本 | | | | | | | | | | | | | | | +----------------+----------------+-------------+-- ---------+-------------+---------- --+--------------+

如您所见,在 Linux 上,core.autocrlfsettings 似乎有效,即使存在 .gitattributesfile。

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

【问题讨论】:

    标签: git carriage-return line-endings eol linefeed


    【解决方案1】:

    似乎误解来自将 text 属性解释为与 autocrlf 配置设置相同的含义。

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

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

    (已添加重点。)

    所以如果你想使用属性来控制你在工作树中得到的行尾,你需要设置eol属性(不仅仅是文本属性)。

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

    core.eol

    当 core.autocrlf 为 false 时,为设置了 text 属性的文件设置要在工作目录中使用的行结束类型。 替代品是 lf、crlf 和 native,它们使用平台的原生行结尾。默认值为原生

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

    【讨论】:

    • 我还是很困惑。根据您的解释,即使我将 core.autocrlf 设置为“false”,我仍然在 Windows 上获得 CRLF 的原因是什么。它应该覆盖 core.eol,对吧?
    • @eversceptic - 这就是 gitattributes 文档所说的,但充其量必须根据 core.eol 和 core.autocrlf 的定义来解释(最坏的情况是 - 和 imo - gitattributes doc 是草率的,它只意味着指出 eol 设置可能不是确定的)。阅读上面截断的 core.eol 文档。当 autocrlf 为 false 时使用它。
    【解决方案2】:

    注意:.gitattributes 文档已更新为 Git 2.21(2019 年 2 月)

    请参阅commit c9446f0commit 2b68085(2019 年 1 月 29 日)Jeff King (peff)
    帮助者:Torsten Bögershausen (tboegi)
    (由 Junio C Hamano -- gitster -- 合并于 commit 13e2630,2019 年 2 月 7 日)

    doc/gitattributes:澄清“autocrlf 覆盖eol

    仅当 core.autocrlf 设置为 core.eol 除了“false”之外的东西。
    让我们更清楚地说明这一点,并将读者指向git-config 定义,其中将对此进行更详细的讨论。

    请注意,将 core.autocrlf 设置为 trueinput 会覆盖 core.eol(请参阅git-config 中这些选项的定义)。

    这又是指Mark Adelsbergeranswer 关于core.eol config
    但这在 Git 2.21 中发生了变化:

    docs/config:澄清core.eol 中的“文本属性”

    `core.eol`:
    


    core.autocrlf为假时设置了text属性的文件设置要在工作目录中使用的行结束类型
    标记为文本(通过设置text 属性,或者通过设置text=auto 和Git 自动将内容检测为文本)。

    替代品是 'lf'、'crlf' 和 'native',它们使用平台的原生行尾。
    默认值为native
    有关行尾转换的详细信息,请参阅 gitattributes
    请注意,如果将 core.autocrlf 设置为 trueinput,则会忽略此值。

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多