带有 autocrlf=true 的 Git 按原样检查带有混合行尾的文件

sdd*_*dds 7 git newline line-endings msysgit core.autocrlf

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

Git 书

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

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

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

检测结果:

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

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

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

为什么会发生这种情况?我没有看到任何关于autocrlf=true不接触带有混合行尾的文件的内容。

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

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

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

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

sas*_*alm 3

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

显然,这种行为是在 Git 中硬编码的,并且不依赖于 core.safecrlf (并且我已经对此进行了测试,即使我将git config core.safecrlf false.

原答案如下:


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

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

请注意这里的评论:

/* No "naked" LF? Nothing to convert, regardless. */
Run Code Online (Sandbox Code Playgroud)

/* If we have any CR or CRLF line endings, we do not touch it */
/* This is the new safer autocrlf-handling */
Run Code Online (Sandbox Code Playgroud)

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

因此,如果您想自动转换文件的行结尾,设置一个处理行尾的.gitattributes文件可能是个好主意。例如:

LF.txt eol=lf
CRLF.txt eol=crlf
Run Code Online (Sandbox Code Playgroud)