7

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

来自Git 书

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

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

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

测试结果:

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

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

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

为什么会这样?我还没有看到任何关于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结尾的混合行结尾文件,这意味着该文件按原样签出,但提交时更改为. 我目前正在另一台机器上工作,无法在我的 msysgit 版本上重现此行为。core.autocrlftrueCRLFLF

4

2 回答 2

2

的价值是core.safecrlf多少?

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

于 2015-04-22T09:53:55.753 回答
2

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

显然,这种行为在 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
于 2018-02-27T11:04:20.957 回答