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

时间:2010-05-13 08:50:11

标签: git line-endings

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

  1. core.autocrlf设置为false

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

    1. 未在gitattributes中正确标记为二进制文件,并且
    2. 碰巧包含CRLF和LF,
    3. 他们将被腐蚀。我的存储库可能包含这样的文件。

      那么为什么我不应该关闭Git的行尾转换呢?网上有很多关于core.autocrlf关闭导致问题的模糊警告,但很少有特定的问题;到目前为止我发现的唯一一个是kdiff3无法处理CRLF结尾(对我来说不是问题),而且一些文本编辑器有行结束问题(对我来说也不是问题)。

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

      在我不知道的情况下离开行结尾是否有任何其他问题?

5 个答案:

答案 0 :(得分:189)

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

  • 避免git status将所有文件显示为modified,因为在将基于Unix的EOL Git存储库克隆到Windows时会自动执行EOL转换(例如,请参阅issue 83)< / LI>
  • 您的编码工具在某种程度上取决于文件中存在的原生 EOL样式:

除非您能看到必须处理原生EOL的具体处理方式,否则最好leaving autocrlf to false

请注意,此配置将是本地(因为配置不会从repo推送到repo)

如果您希望克隆该回购的所有用户使用相同的配置,请使用What's the best CRLF handling strategy with git?中的 text 属性查看“.gitattributes file”。 / p>


注意:启动git 2。8(2016年3月),合并标记将不再在CRLF文件中引入混合行尾(LF)。
请参阅“Make Git use CRLF on its “<<<<<<< HEAD” merge lines

答案 1 :(得分:29)

我是.NET开发人员,多年来一直使用Git和Visual Studio。我的强烈建议是设定行结束为真。并尽可能早地在存储库的生命周期内完成。

话虽如此,我讨厌Git改变我的行结尾。源代码控制应该只保存和检索我做的工作,它不应该修改它。永远。但确实如此。

如果你没有让每个开发人员都设置为真,会发生什么,一个开发人员最终会设置为true。这将开始在您的仓库中将所有文件的行结尾更改为LF。当用户设置为false检查时,Visual Studio会警告您,并要求您更改它们。你会很快发生两件事。一,你会得到越来越多的警告,你的团队越大,得到的就越多。第二个也是最糟糕的是,它会显示每个修改过的文件的每一行都被更改(因为每一行的行结尾都会被真正的人改变)。最终,您无法再可靠地跟踪回购中的变化。让每个人都保持真实,比试图让每个人都虚假更容易和更清洁。尽管你可靠的源代码控制正在做一些不应该做的事情,但这很可怕。如初。

答案 2 :(得分:12)

<强>更新

注意:如VonC所述,从Git 2.8开始,合并标记will not introduce Unix-style line-endings to a Windows-style file

<强>原始

我注意到这个设置的一个小小问题是,当存在合并冲突时,git添加的行会标记差异吗 not 有Windows行结尾,即使是其余的该文件的作用,你可以得到一个具有混合行结尾的文件,例如:

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

这不会给我们带来任何问题(我想任何可以处理这两种类型的行结尾的工具也会对混合行结尾做出明智的决定 - 当然我们使用的所有行为都是合理的),但这是有道理的。意识到了。

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

    // Not changed

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

*这个词并不值得:“问题”。

答案 3 :(得分:0)

对我来说。

编辑.gitattributes文件。

添加

*.dll binary

然后一切顺利。

答案 4 :(得分:0)

我正在 GitHub 上工作,我发现 this article 很有帮助。

描述了git autocrlf的配置和.gitattributes文件的设置。