让Git在其“<<<<<<<<<<< HEAD”合并行上使用CRLF

时间:2013-07-24 11:25:16

标签: git eol

是否有可能要求Git在需要合并时将其放入文件的行末尾使用CRLF而不是LF?

Merge using LFs

如果在没有可见EOL字符的文本编辑器中解决冲突,如果您通过选择删除,很容易意外地将这些LF合并:

Delete by selection

离开你:

LFs sneak into file!

现在有两个LF已经潜入你的CRLF文件了!

显然,另一种选择是在解析合并时更多地关注行结尾,但我想如果有办法告诉Git将CRLF用于它在这里生成的行,我会问。

3 个答案:

答案 0 :(得分:10)

  

是否有可能要求Git在需要合并时将其放入文件的行末尾使用CRLF而不是LF?

它......实际上是可能的,来自git 2.7.2+ (February 2016) 而且你不需要做任何事情。

commit 15980decommit 86efa21Johannes Schindelin (dscho)(2016年1月27日) Junio C Hamano -- gitster --在2016年2月17日commit ab2c107合并)

  

merge-file:让冲突标记与上下文的行尾样式匹配

     

将文件与CR / LF行结尾合并时,冲突标记应该   匹配那些,以免输出文件具有混合行结尾

     

这在Windows上尤其令人感兴趣,一些编辑得到了   真的被混合行结尾混淆了。

     

Beat Bolli的这个补丁的原始版本尊重core.eol,并且   此开发人员随后的改进也得到尊重gitattributes   然而,这种方法是次优的:git merge-file被发明为一种   替换GNU合并的替代品,因此运行没有问题   在任何存储库之外!

     

Junio指出了原始方法的另一个问题   Hamano:遗留存储库可能会使用其文本文件   CR / LF行结尾(以及core.eolgitattributes会给我们一个   那里的假象。 因此,更优越的方法是   只需匹配上下文的行结尾(如果有)

     

我们实际上根本不需要查看整个上下文:

     
      
  • 如果文件都是LF,或者它们都有CR / LF行结尾,只需查看单个行即可匹配该样式。
  •   
  • 如果线路结尾无论如何都是混合的,那么仍然可以模仿一条线的eol:我们只会添加到一堆混合线的结尾,   我们无能为力。
  •   
     

所以我们所做的是:我们看看冲突前的线,下降   回到之前的行,如果它是最后一行而且没有   行结束,回到第一行,首先是第一行   后图像,然后是第二张后图像,最后是前图像   如果我们找到一致的CR / LF(或未定)的行尾样式,我们匹配   否则我们会使用仅LF的行结尾作为冲突标记。

     

请注意,虽然我们必须至少有两行   可以看一下(否则就没有冲突),同样不是这样   对于行结尾:有问题的三个文件都可以包含一个   单行没有任何行结尾,每行。在这种情况下,我们会回归   仅使用LF。

答案 1 :(得分:3)

没有设置控制用于“<<<<<<<<<<< git中的标记;它们被硬编码为在git源代码中使用'\n'(参见line 173 of xmerge.c)。

如果您将“eol”或“core.eol”设置设为“crlf”,则“<<<<<<<标记将在文件中有\r\n行结尾(这发生在涂抹/清除过滤步骤中,在上面链接的代码之后),但这有一个重大的副作用:文件将在路上“标准化”进入存储库,因此您将使用unix行结尾提交文件。

这可能不是您想要的.Net项目,如上例所示。

所以我没有给你一个好的答案,抱歉。

答案 2 :(得分:1)

我不确定是否有全局方法可以执行此操作,但您可以在.gitattributes文件中为每个文件扩展名设置默认EOL字符(请参阅{{3}的行尾转换部分}。

例如,编辑git项目根目录中的.gitattributes文件,使其包含如下内容:

*.cs         eol=crlf
*.config     eol=crlf