Why should I use core.autocrlf=true in Git?
我有一个从Windows和OS X访问的Git存储库,我知道已经包含一些带有CRLF行结尾的文件。据我所知,有两种方法可以解决这个问题:
到处设置core.autocrlf到false,
按照此处的说明(在GitHub的帮助页面上回应)将存储库转换为仅包含LF行结尾,然后在Windows上将core.autocrlf设置为true,在OS X上设置input。执行此操作的问题是如果我在存储库中有任何二进制文件:
在gitattributes中未正确标记为二进制文件,并且
碰巧包含CRLF和LF,
他们会被腐化。我的存储库可能包含这些文件。
那么为什么我不应该关闭Git的行结束转换呢?网上有很多关于core.autocrlf关闭导致问题的模糊警告,但很少有具体问题;到目前为止我唯一发现的是kdiff3无法处理CRLF结尾(对我来说不是问题),而且一些文本编辑器有行结束问题(对我来说也不是问题)。
存储库是我公司的内部存储库,因此我不需要担心与具有不同autocrlf设置或行结束要求的人共享它。
是否有任何其他问题只是留下我不知道的行结尾?
-
stackoverflow.com/questions/2333424/会有帮助吗?我链接到将autocrlf保留为false的具体原因。
-
@VonC谢谢,但我已经能够指示公司中的所有用户都将autocrlf设置为false,并且目前认为这是最佳选择。但我想知道是否有任何理由我不应该这样做,因为我可以发现有很多人(例如GitHub)说我应该设置autocrlf,但没有实际具体说明原因。
-
@VonC即我没有找到将autocrlf设置为false的原因。我正在寻找将其设置为true的理由。
-
好吧(我误导了"刚刚离开行结尾"的最后一个问题,即"autocrlf设置为false"。我已经写了一个答案,开始解决相反的问题(设置为true ),但没有什么是非常确定的。
-
为什么不使用autocrlf = input:它似乎是两个极端之间的完美解决方案:你保持你的repo清理CRLF废话,本地Windows开发人员可以使用他们想要的任何东西,而他们的本地文件没有任何魔法自动完成。 (他们可能出于各种原因想要本地LF,所以true在我看来很糟糕。)我看不到使用autocrlf = input的任何缺点。
-
@iconoclast,autocrlf = input使stash --patch失败并显示"无法删除工作树更改"
-
@PiotrFindeisen:非常有趣。所以肯定有一个缺点。不过,听起来像是一个小虫。它只会在Git为您在行结尾之间进行转换时失败,或者如果您使用autocrlf = input它总是会失败吗?
-
@iconoclast,我没有广泛测试。今天我发现只有在我删除autocrlf设置之后我才能藏匿。有问题的文件与CRLF一起存储在repo中 - 也许这是不受支持的组合?
-
@PiotrFindeisen:你不能用autocrlf = input或只用--patch隐藏?
-
不检查。没有--stash开关我就活不下去。
-
@iconclast,我遇到的一个原因是你是否构建了包含Windows批处理文件和Unix shell脚本的发行版。你想在每种情况下都使用正确的行结束,如果Git即使你以某种方式明确地设置它们之后也会调整它们,这就更难了。
-
NB。经常引用的GitHub文章help.github.com/articles/dealing-with-line-endings实际上是基于一个SO答案 - stackoverflow.com/questions/1510798/ - 这部分解释了这种自我延续的混乱。
将autocrlf设置为true的唯一具体原因是:
-
避免git status将所有文件显示为modified,因为在将基于Unix的EOL Git存储库克隆到Windows时会自动执行EOL转换(例如,请参见问题83)
-
并且您的编码工具以某种方式依赖于文件中存在的本机EOL样式:
-
例如,代码生成器硬编码以检测本机EOL
-
其他外部批次(在您的仓库外部)使用正则表达式或代码集来检测本机EOL
-
我相信一些Eclipse插件可以在平台上生成带有CRLF的文件,这可能是个问题。
-
您使用Notepad.exe进行编码(除非您使用的是Windows 10 2018.09+,其中Notepad尊重检测到的EOL字符)。
除非您能看到必须处理原生EOL的特定处理,否则最好将autocrlf留给false。
请注意,此配置将是本地配置(因为配置不会从repo推送到repo)
如果你想为克隆那个repo的所有用户提供相同的配置,请使用.gitattributes文件中的text属性查看"使用git最好的CRLF处理策略是什么?"。
注意:启动git 2。8(2016年3月),合并标记将不再在CRLF文件中引入混合行结尾(LF)。
请参阅"让Git在其上使用CRLF"<<<<<<< HEAD"合并线"
-
@VonC谢谢!这让我更有信心使用autocrlf=false对我来说是安全的。出于兴趣,你知道为什么即使你将autocrlf设置为false,git仍会进行eol转换吗?
-
@Rich我相信Git默认情况下会进行eol转换(例如,如果autocrlf没有设置的话)
-
@VonC:我不认为这个答案是对的。在Windows上使用core.autocrlf = true按预期工作。来自repo的所有文件(在此方案中应该具有LF行结尾)在结账时转换为CRLF行结尾到Windows PC。从Windows PC提交时,所有文件都转换回LF行结尾。遇到麻烦的方法是最初检查到具有错误core.autocrlf设置的Windows PC(这完全太容易了)。
-
@Michael:我认为问题主要是与git svn一起使用时:结果有一个git status报告了索引和HEAD之间的许多差异。对于经典克隆(没有svn),你是对的。
-
@Michael所以在这种情况下,如果我有一些工具/编辑器会被行结尾搞糊涂,那么在我的场景中不使用core.autocrlf=false的唯一原因是什么?
-
@Rich:我不知道你原来问题的答案,但我确实给了你一个+1的问题,因为我认为它很有趣和相关。
-
@迈克尔:谢谢!我们已将其设置为false,如果遇到任何问题,我会添加自己的答案。
-
我绝对会使用false,我从未成为后台发生的自动或魔术事件的忠实粉丝。只需在任何地方使用
和UTF-8就可以了。如果某些坚果头不明白有惯例和规则并且忘记使用UTF-8或
,那么有人会手动转换它们并拍打他的脸。
-
如果您不幸在Visual Studio 6项目或包含Wise Installer脚本(至少版本9)的项目上工作,那么您肯定希望这个集合是自动的 - 这些是期望CRLF的两个工具。
-
@ Pauld'Aoust我仍然希望在.gitattributes文件中指定需要CRLF到core.eol属性的文件类型,而不是使用不加选择地应用于所有文件的全局core.autocrlf设置。
-
@VonC足够公平;我不想让Git为我做出这些决定 - 我发现当core.autocrlf为真时我的一切都很好。
-
在hg docs mercurial.selenic.com/wiki/EolExtension中找到了如何(不)使用autocrlf的最佳解释(注意"最后的手段"警告)
-
+1我同意。此外,当在窗户下工作时,避免接触crlf是个好主意。 eclipse emacs和大多数高级编辑器/ ide都可以处理不同的平台线路结束。
-
它对于源文件可能期望的项目变得更加重要并创建CRLF行结尾,但是某些文件的检出要求您保留行结尾,如bash脚本。我正在开发一个针对Windows开发的软件,但也有我们想要不受影响的bash脚本,但可以进行编辑和版本控制。这些混合行结束意味着我们要么需要autocrlf = false,要么需要为特定文件创建.gitattributes。
-
正如GIT文档所示,要使用的设置取决于您的特定客户端计算机。无论回购的位置如何,如果您在MS Windows框中进行编辑,您可能希望将其设置为AUTO,因此放在Windows文件系统上的文件具有CR-LF结尾,因此您可以使用简单的文本编辑器编辑文件。如果你在unix / linux / osx系统上工作和结束然后你想要它设置为INPUT,那么当文件从文件系统添加到repo时CR-LF被转换为LF,但是它保留了LF形式写入文件系统时就位。
-
我们使用Windows和Mac客户端的混合,似乎autocrlf设置在Windows上为true,在Mac上为空(GIT客户端的混合)。
-
@Minok我想你可能需要重新阅读这个问题。您只是重申标准建议,但这不适用于相关存储库。
-
@Tower MonoDevelop解决方案和项目文件(以及其他配置文件)似乎总是使用CRLF,并且没有内置选项来更改AFAIK(使用最新的v6.x)。在git diff输出中看到它们是非常烦人的。
-
@ray仍然,您应该能够配置Monodevelop编辑器:stackoverflow.com/a/24700026/6309,clipoverflow.com/a/9984943/6309,answer.unity3d.com/questions/424631/
-
@VonC确实;我对代码编辑器本身没有任何问题,但谢谢。
我是.NET开发人员,多年来一直使用Git和Visual Studio。我的强烈建议是设定行结束为真。并在存储库的生命周期中尽早完成。
话虽如此,我讨厌Git改变我的行结尾。源代码控制应该只保存和检索我做的工作,它不应该修改它。永远。但确实如此。
如果你没有让每个开发人员都设置为true会发生什么,那么ONE开发人员最终会设置为true。这将开始在您的仓库中将所有文件的行结尾更改为LF。当用户设置为false检查时,Visual Studio会警告您,并要求您更改它们。你会很快发生两件事。一,你会得到越来越多的警告,你的团队越大,得到的就越多。第二个也是最糟糕的是,它会显示每个修改过的文件的每一行都被更改(因为每一行的行结尾都会被真正的人改变)。最终,您将无法再可靠地跟踪回购中的更改。让每个人都保持真实,比试图让每个人都虚假更容易和更清洁。尽管你可靠的源代码控制正在做一些不应该做的事情,但这很可怕。永远。
-
我的公司足够小,以至于我们可以轻易地要求虚假在任何地方使用,我认为大公司可以通过政策来做到这一点,但我想这是使用"真实"的正当理由,所以我很赞成无论如何。谢谢!
-
使用策略(强制执行文件)执行此操作的问题是,在Windows计算机上,您可以拥有本地,全局和隐藏配置文件(ProgramData / Git / Confg)。您可以通过将其签入到repo中来强制执行本地,但Global和隐藏文件优先。也可以使本地和全局(或隐藏)不同。如果是,它们将在SAME机器上相互冲突,导致行结束错误,而没有。追踪是一种痛苦。 :(
-
正是我的想法。它不是源代码控制的工作,因为它喜欢乱码代码文件。行结尾应该只是编辑工具的一个问题,仅此而已。
-
也许可以在服务器上添加一个钩子,以防止推送这些类型的更改。
-
有可能。我不熟悉.git的服务器挂钩。我使用的是拒绝某些用户向主分支等关键分支写入权限,并强制执行拉取请求以防止可怕的签入。对于大型团队来说,管理和设置一致的行结束方案并不是非常困难。非常值得。如果您熟悉添加钩子的好方法,请在评论中留下链接。 :)
-
如果您的项目仅限Windows,则没有问题。但是,如果您或您的同事在* nix平台上工作,那么您的"强烈建议"将导致问题。尝试使用以
结尾的shebang运行bash,perl或python脚本,你会看到。
-
我同意100%。这就是为什么我用最常见的环境描述开始我的答案。据我所知,Windows用户上的非Visual Studio将从其他答案中受益更多。但是在Windows和Visual Studio中,记住我的观点非常重要。 :)
-
您描述的情况不是GIT的问题,将设置设置为FALSE,因为它通常应该是,它已经消失了。 Instad,这是团队工作中的一个问题。什么意思"最终一个开发人员设置true"?你为什么要首先允许它们呢?当你设置它们来访问git repo时,就像你不允许用不同的lang污染某些区域一样(所以任何人都可以读取它),或者就像你保持分支/合并/ rebase / etc一样政策,他们应该得到一个明确的规则:设置正确的crlf。
-
如果您担心人们忽略该规则,请设置一个预提交钩子,该钩子将在提交之前和之后计算[^
]
的数量和
的数量,并在差异结束时使其失败,例如,相对来说,文件中超过70%的行,如果绝对数量<= 5则留下一个小后门使其通过,因此可以进行小的行结束修复。
-
我在微软的网站上完全看到了这个问题。他们的系统是唯一一个使用愚蠢的CRLF换行符的系统。
-
作为一个停止间隙解决方案,您可以让您的构建系统放置一个预提交git-hook,如果它检测到git pull的配置文件中的autocrlf选项设置为true,将停止其轨道上的每个提交。这可能会解决问题。
更新:
注意:正如VonC所指出的,从Git 2.8开始,合并标记不会将Unix样式的行结尾引入Windows样式的文件。
原版的:
我注意到这个设置的一个小小问题是,当存在合并冲突时,git添加的行添加标记差异没有Windows行结尾,即使文件的其余部分有,也可以结束带有混合行结尾的文件,例如:
1 2 3 4 5 6 7
| // 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行结尾的文件的更改时,已添加的行显示其回车符,因此:
1 2 3 4 5 6
| // Not changed
+ // New line added in^M
+^M
// Not changed
// Not changed |
*这个词并不值得:"问题"。 sub>
-
注:当Visual Studio遇到这样的文件时,它会为您规范化行尾。选择Windows行结尾或选择不规范行结尾工作正常(因为VS仍然正确显示它,一旦解决了冲突,违规行将被删除)。
-
不幸的是,公司版本控制纳粹不同意它(合并冲突标记上的LF)不是问题。
-
我同意合并冲突标记上的LF应该不是问题。无论如何,这些线路不应该用于回购。
-
注意:启动git 2。8(2016年3月),合并标记实际上会有CRLF行结束。请参阅stackoverflow.com/a/35474954/6309