【问题标题】:Git with autocrlf=true checks out files with mixed line endings as-is带有 autocrlf=true 的 Git 按原样检查具有混合行结尾的文件
【发布时间】:2015-06-29 20:40:37
【问题描述】:

所以,我一直认为core.autocrlf=true Git 在将文件检出到工作目录时会将所有LF 结尾替换为CRLF

来自Git book

如果您使用的是 Windows 机器,请将其设置为 true - 这会在您签出代码时将 LF 结尾转换为 CRLF

但是,当检出具有混合行结尾且 core.autocrlf 设置为 true 的文件时,我的 Git 版本会按原样检出文件。

我找到了一个非常方便的 GitHub 存储库来测试这种行为 - https://github.com/YueLinHo/TestAutoCrlf

测试结果:

  • 只有LF 结尾的文件 (LF.txt)
    • 使用autocrlf=false:按原样签出(所有行结尾都是LF
    • 使用autocrlf=true:结帐时所有行尾都更改为CRLF

到目前为止一切顺利,一切都符合我的预期。现在对于具有混合行尾的文件:

  • 具有混合行尾的文件(MIX-more_CRLF.txt、MIX-more_LF.txt)
    • 使用 autocrlf=false:按原样签出(LFCRLF 的混合)
    • autocrlf=true:按原样签出(LFCRLF 的混合)

为什么会这样?我没有看到任何关于 autocrlf=true 不接触具有混合行结尾的文件的信息。

我的 Git 设置有问题吗?在使用全局 .gitconfig 中的 autocrlf=true 签出后,我检查了存储库文件夹中运行 git config --get core.autocrlfcore.autocrlf 设置,并且命令返回 true。没有 .gitattributes 文件可以覆盖设置。

所有测试均在 Git 版本 1.9.5.msysgit.0 上进行。

编辑:在最新的 msysgit 版本 1.9.5.msysgit.1 上的行为相同。

我最初的问题是,我以某种方式设法提交了一个只有LF 结尾的混合行结尾文件,同时将core.autocrlf 设置为true,这意味着文件按原样签出,但使用@ 提交987654348@ 更改为 LF。我目前正在另一台机器上工作,无法在我的 msysgit 版本上重现此行为。

【问题讨论】:

  • 这实际上听起来像是一个不错的默认值;如果一个文件有混合的行尾,那么在一般情况下可能有一个很好的理由。显而易见的解决方案是将文件转换为系统默认的行尾,然后提交,允许 git 转换行尾。
  • @MicroVirus 也许这是一个很好的默认值,但我还没有在任何地方看到这种行为,所以我想知道为什么会这样。

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


【解决方案1】:

我正在重新发布一个被其所有者删除的答案,因为我认为它给出了最好的解释。我不知道作者为什么删除它,我认为它是正确的,我已经投票取消删除。

显然,这种行为在 Git 中是硬编码的,并且不依赖于 core.safecrlf(我已经对此进行了测试,即使我设置了 git config core.safecrlf false,混合文件也不会受到影响。

原答案如下:


Autocrlf 转换混合行结尾,正如 git 的源代码所说:

https://github.com/git/git/commit/a0ad53c18100226cb1a138cb9b3bc3615170be8f

注意这里的 cmets:

/* No "naked" LF? Nothing to convert, regardless. */

/* If we have any CR or CRLF line endings, we do not touch it */
/* This is the new safer autocrlf-handling */

混合行结尾转换是不可逆的,完成后,Git 崩溃了。

所以,如果您想自动转换文件的行尾,最好设置一个处理行尾的.gitattributes 文件。 如:

LF.txt eol=lf
CRLF.txt eol=crlf

【讨论】:

    【解决方案2】:

    core.safecrlf 的值是多少?

    如果将core.safecrlf 设置为true,则不会转换混合行结尾文件。 (因为如果混合行尾,转换是不可逆的)

    【讨论】:

    • git config --get core.safecrlf 在存储库文件夹中返回一个空行,所以我猜它没有设置。
    • 所以也许它的默认值为true。
    • 但是如果发生任何转换,core.safecrlf=true 不会让我提交带有混合行结尾的文件。 warn 会通知我。相反,即使我将core.safecrlf 明确设置为true,我也不会收到任何关于此类提交的消息。
    • @MicroVirus 是的,就是这样。
    猜你喜欢
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    相关资源
    最近更新 更多