使用autocrlf = true的Git检出具有混合行结尾的文件

时间:2015-04-22 09:32:48

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

所以,我一直认为用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中使用core.autocrlf签出后,我检查了存储库文件夹中运行git config --get core.autocrlf的{​​{1}}设置,并且命令返回true。没有.gitattributes文件来覆盖设置。

所有测试均在Git版本autocrlf=true上完成。

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

我原来的问题是,我设法提交了一个只有1.9.5.msysgit.1结尾的混合行结尾文件,同时将LF设置为core.autocrlf,这意味着该文件已被检出 - 是的,但是true已将其更改为CRLF。我目前在另一台机器上工作,无法在我的msysgit版本上重现此行为。

2 个答案:

答案 0 :(得分:2)

core.safecrlf的价值是什么?

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

答案 1 :(得分:1)

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

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

原始答案如下:

Autocrlf 不会转换混合行结尾,因为git的源代码告诉:

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

请注意这里的评论:

/* 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