所以,我一直认为用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
到目前为止一切都那么好,一切都如我所料。现在,对于具有混合行结尾的文件:
autocrlf=false
:按原样签出(LF
和CRLF
混合使用)autocrlf=true
:按原样签出(LF
和CRLF
混合使用)为什么会这样?我还没有看到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版本上重现此行为。
答案 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