我想git
使用类似于git
描述“合并冲突”的语义来合并两个非基于文本文件。
例如,假设我有两个内容相似但不相同的文本文件,名为file.1
和file.2
。我想将这两个文件合并到第三个文件中,如下所示:
hypothetical-merge-utility file.1 file.2 file.merged
我希望它产生file.merged
,它将以类似于以下的方式列出文件内容和每个差异:
common line 1 ...
common line 2 ...
common line 3 ...
<<<<<<< file.1
something unique from file.1
a second line of something unique from file.1
======= file.2
something unique from file.2
>>>>>>> end of diff
common line 4 ...
common line 5 ...
<<<<<<< file.1
something unique from file.1
======= file.2
something unique from file.2
a second line of something unique from file.2
>>>>>>> end of diff
common line 6 ...
common line 7 ...
... etc. ...
换句话说,我希望和之间的每个差异file.1
看起来file.2
类似于git
“合并冲突”的表示。
我不在乎是否使用了 , 和 以外<<<<<<<<
的========
分隔符>>>>>>>>
。
我知道有许多实用程序可用于在 linux 下合并文本文件。但是,我只是在寻找以类似于git
描述“合并冲突”的方式专门呈现合并数据的东西。
有谁知道这样的实用程序?
先感谢您。
更新:根据 Ed Morton 的以下问题,这是两个测试文件的内容......
==== 文件.1 ====
common line 1 ...
common line 2 ...
common line 3 ...
something unique from file.1
a second line of something unique from file.1
common line 4 ...
common line 5 ...
something unique from file.1
common line 6 ...
common line 7 ...
==== 文件.2 ====
common line 1 ...
common line 2 ...
common line 3 ...
something unique from file.2
common line 4 ...
common line 5 ...
something unique from file.2
a second line of something unique from file.2
common line 6 ...
common line 7 ...
注意:虽然我认为这是一个有点合理的“答案”,但我现在想出了另一个我认为更好的“答案”。所以请看下面我的另一个“答案”。
这个“答案”的原始版本......
哦!我在这里发布得太早了。我不知道
-D
命令行选项diff
,现在我意识到我可以做到这一点......它将产生以下内容
file.merged
...我可以像处理's
#ifdef
、#else
和行一样处理、和行。#endif
git
<<<<<<<<
========
>>>>>>>>
更新:...我刚刚发现: https ://stackoverflow.com/questions/16902001/manually-merge-two-files-using-diff
它展示了我如何也可以使用统一差异格式做类似的事情。给出
diff
一个-U
参数很大的选项,该参数大于 和 中的最大行file.1
数file.2
。例如 ...然后它将产生这个:
+
线条代表 中的唯一数据,file.2
线条-
代表 中的唯一数据file.1
。我可以处理这些
+
和-
台词。听起来您并不真正关心输出格式,而只是想知道如何识别每个文件中的哪些行或常见的行。给,怎么样:
警惕任何必须测试行的内容以获得该行的源指示符的任何解决方案(例如,如果您正在寻找
<<<<<<< file.1
告诉您什么是独特的file1
- 如果file
包含一个正是该字符串的行怎么办? ) 而不是始终且仅出现在每行中唯一位置的指示符,因为如果该字符串可能在您的输入中,则对任何字符串的测试都将失败。上面的第一个字符始终是该行来自何处的指示符,因此它不会与可能的文件内容发生冲突。如果您真的想准确获得输出的 git merge 冲突格式(我不推荐),您总是可以将上面的内容通过管道传输到一个简单的 awk 脚本进行打印<<< file
或当该行的第一个字符更改然后删除该字符时,您喜欢的任何内容。由于我最初在我的第一个“答案”中发布的解决方案的局限性
diff -D ...
,diff -U ...
我决定使用 python 的difflib
模块在 python 中编写一个解决方案。我编写它是为了生成看起来与
git
. 它使用包含字符串<<<<<<<<
、========
和的分隔符>>>>>>>>
,并且我们知道,如果原始文本包含这样的字符串,这可能会导致歧义。但是,同样的歧义问题可能存在于 的“合并冲突”输出中git
,但由于我对此感到满意git
并愿意接受它,因此我也对自己的解决方案中的这些歧义感到满意。输出与“合并冲突”输出的输出并不完全相同
git
,但足以满足我的愿望。首先,这是python程序(我清理了我在这里发布的原始python代码,这是清理后的版本)。我称这个程序
filemerge
...这是我测试它的输入文件。它们与我最初在此处的问题中发布的输入文件相似但不完全相同...
====
file.1
========
file.2
====我像这样运行命令...
这些是
file.merged
...的结果内容正如我所提到的,这与来自 的“合并冲突”输出的格式并不完全相同
git
,但它非常相似,这对我来说已经足够接近了。