是否有可能要求Git在需要合并时将其放入文件的行末尾使用CRLF而不是LF?
如果在没有可见EOL字符的文本编辑器中解决冲突,如果您通过选择删除,很容易意外地将这些LF合并:
离开你:
现在有两个LF已经潜入你的CRLF文件了!
显然,另一种选择是在解析合并时更多地关注行结尾,但我想如果有办法告诉Git将CRLF用于它在这里生成的行,我会问。
答案 0 :(得分:10)
是否有可能要求Git在需要合并时将其放入文件的行末尾使用CRLF而不是LF?
它......实际上是可能的,来自git 2.7.2+ (February 2016) 而且你不需要做任何事情。
commit 15980de见commit 86efa21,Johannes 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.eol
和gitattributes
会给我们一个 那里的假象。 因此,更优越的方法是 只需匹配上下文的行结尾(如果有)。我们实际上根本不需要查看整个上下文:
- 如果文件都是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