11

Is it possible to ask Git to use CRLF instead of just LF at the end of the lines it puts into a file when it needs merging?

Merge using LFs

If resolving conflicts in a text editor without visible EOL characters, it is easy to accidentally end up with these LFs getting merged if you delete by selection:

Delete by selection

Leaving you with:

LFs sneak into file!

And now two LFs have sneaked their way into your otherwise CRLF file!

Obviously one alternative is to just take more care over line endings when resolving merges, but I thought I would ask in case there were a way to tell Git to use CRLF for the lines it generates here.

4

3 回答 3

11

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

它...实际上是可能的,从git 2.7.2+ (February 2016) 开始
你不必做任何事情。

请参阅Johannes Schindelin ( )的commit 15980decommit 86efa21(2016 年 1 月 27 日) 。(由Junio C Hamano 合并 -- --提交 ab2c107中,2016 年 2 月 17 日)dscho
gitster

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

当合并带有 CR/LF 行尾的文件时,冲突标记应该匹配那些,以免输出文件有混合行尾

这在 Windows 上尤其重要,有些编辑器 对混合行结尾感到非常困惑。

这个补丁的原始版本受到 Beat Bolli 的尊重core.eol,而这个开发者的后续改进也受到了尊重gitattributes
但是,这种方法不是最理想的:git merge-file被发明为 GNU 合并的替代品,因此在任何存储库之外运行都没有问题!

Junio Hamano 指出了原始方法的另一个问题:遗留存储库可能使用 CR/LF 行结尾提交其文本文件(并且core.eolgitattributes那里会给我们一个错误的印象)。因此,更好的方法是简单地匹配上下文的行尾,如果有的话

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

  • 如果文件都是 LF-only,或者它们都具有 CR/LF 行结尾,则只需查看一行以匹配该样式就足够
  • 而且,如果行尾是混合的,仍然可以只模仿一行的 eol:我们只会添加到混合行尾的堆中,对此我们无能为力。

所以我们要做的是:我们查看冲突之前的行,如果它是最后一行并且没有行结尾,则回退到之前的行,然后回退到第一行,首先在第一个后图像中,然后是第二个后图像,最后是前图像。
如果我们找到一致的 CR/LF(或未确定的)行尾样式,我们匹配,否则我们使用 LF-only 行尾作为冲突标记。

请注意,虽然确实必须至少有两行我们可以查看(否则不会发生冲突),但对于行却不是这样:所讨论的三个文件都可以由一行组成,而没有任何行结尾,每个。在这种情况下,我们回退到仅使用 LF。

于 2016-02-18T07:06:49.280 回答
3

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

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

这可能不是您想要的 .Net 项目(如上面的示例)。

所以我没有给你一个好的答案,对不起。

于 2013-07-24T15:17:13.057 回答
1

我不确定是否有这样做的全局方法,但您可以为 .gitattributes 文件中的每个文件扩展名设置默认 EOL 字符(请参阅gitattributes 文档的行尾转换部分。

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

*.cs         eol=crlf
*.config     eol=crlf
于 2013-07-24T12:31:08.080 回答