为什么我应该在Git中使用core.autocrlf = true?

我有一个可以从Windows和OS X访问的Git存储库,而且我知道已经包含一些带有CRLF行结尾的文件。 据我所知,有两种方法可以解决这个问题:

  1. core.autocrlf设置为false

  2. 按照这里的说明(在GitHub的帮助页面上回显)来将存储库转换为仅包含LF行结束core.autocrlf ,然后在Windows core.autocrlf设置为true ,并在OS X上进行input 。这样做的问题是,如果我有存储库中的二进制文件:

    1. 在gitattributes中没有正确标记为二进制
    2. 碰巧包含CRLF和LF,

    他们将被损坏。 我的资源库可能包含这样的文件。

那么为什么我不应该关掉Git的换行符? 网上有很多模糊的警告,关于core.autocrlfclosures导致问题,但很less有具体的; 到目前为止,我发现的唯一情况是kdiff3无法处理CRLF结局(对我来说不是问题),而且一些文本编辑器也有行结束的问题(对我来说也不是问题)。

资源库是我公司的内部资源,所以我不用担心与具有不同autocrlf设置或行结束要求的人共享资源库。

是否还有其他问题,只是我不知道?

autocrlf设置为true的唯一具体原因是:

  • 避免git status显示所有的文件被modified因为在将基于Unix的EOL Git仓库克隆到Windows时会自动进行EOL转换(例如参见问题83 )
  • 你的编码工具在某种程度上取决于你的文件中存在的本地 EOL风格:
    • 例如,硬编码的代码生成器来检测本地EOL
    • 其他外部批处理(外部回购)与正则expression式或代码集来检测本地EOL
    • 我相信一些Eclipse插件可以生成CRLF文件而不pipe平台,这可能是一个问题。

除非你能看到必须处理本地EOL的具体处理, 否则最好autocrlf使autocrlf

请注意,这个configuration将是一个本地configuration(因为configuration不是从回购推到回购)

如果你想为所有的用户configuration相同的configuration来克隆这个.gitattributes ,那么使用.gitattributes文件中的text属性来检查“ 什么是最好的CRLF处理策略?


注意:启动git 2.8(2016年3月),合并标记将不再在CRLF文件中引入混合行尾(LF)。
请参阅“ 使Git使用CRLF”<<<<<<< HEAD“合并行 ”

我是一个.NET开发人员,并使用Gi​​t和Visual Studio多年。 我强烈的build议是行结束为真。 在存储库的生命周期中尽可能早地做到这一点。

这就是说,我恨Git改变我的行结束。 源代码pipe理只能保存和检索我所做的工作,不应该修改它。 永远。 但它确实如此。

如果你没有把每个开发者都设置为真,那么会发生什么呢?一个开发者最终会设置为true。 这将开始在您的回购中将所有文件的行结尾更改为LF。 当用户设置为false时,Visual Studio会警告你,并要求你改变它们。 你将有两件事情发生很快。 第一,你会得到越来越多的警告,越多你的团队越大。 第二,更糟糕的是,它会显示每一个修改过的文件的每一行都被改变了(因为每一行的行结尾都会被真正的人改变)。 最终你将无法可靠地跟踪你的回购变化。 让每个人都保持真实,而不是试图让每个人都是假的,这是更容易和更清洁的。 尽可能地忍受你的信任源代码pipe理正在做的事情是不可能的。 永远。

更新

注意:正如VonC所指出的那样,从Git 2.8开始,合并标记不会将Unix风格的行尾引入到Windows风格的文件中 。

原文

我在这个设置中发现的一个小问题是,当合并冲突时,git添加了一些行来标记差异, 没有 Windows行结束符,即使文件的其余部分结束了,也可能结束用混合行结尾的文件,例如:

 // Some code<CR><LF> <<<<<<< Updated upstream<LF> // Change A<CR><LF> =======<LF> // Change B<CR><LF> >>>>>>> Stashed changes<LF> // More code<CR><LF> 

这不会造成我们任何问题(我想象任何能够处理这两种types的行结束的工具也可以处理混合的行结束 – 当然我们使用的是所有的行结束),但这是要注意的事情。

我们发现的另一件事情是,当使用git diff查看具有Windows行结束符的文件的更改时,已添加的行显示其回车符,因此:

  // Not changed + // New line added in^M +^M // Not changed // Not changed 

*它并不真正值得使用这个术语:“问题”。