3

KDiff3 可以解释标准差异冲突标记吗?

解释:

我目前将 KDiff3 设置为 Mercurial 中的合并工具。我从终端会话运行我的合并(例如hg merge),当遇到冲突时,Mercurial 调用 KDiff3 进行 3 路合并,正如预期的那样。

我想做的是首先使用 Mercurial 的内部merge3算法并将冲突标记留在文件中 - 然后随意解决单个文件(而不是尝试一次完成所有合并)。

我想将合并工具传递给 resolve 命令(例如hg resolve --tool kdiff3 file.txt),但看起来 KDiff3 不处理冲突标记,而是希望提供三个文件作为命令行参数。

有没有办法做我想做的事?我宁愿在 GUI 中查看差异,也不愿手动编辑冲突标记。

4

1 回答 1

2

我不完全确定您到底想做什么;我猜的,如果我错了,请纠正我。

首先,几乎所有合并工具都需要两个或三个文件来执行合并。这就是这些工具的设计方式;直接处理带有冲突标记的文件的工具非常罕见。但是,这取决于您选择执行此操作的工具;如果您需要,Mercurial 和 kdiff3 无法帮助您:您需要一个不同的工具。

其次,让我们深入了解一下合并工具是如何配置的。您可以查看hg help mergetools可用合并工具的列表以及如何选择一个,以及hg help config.merge-tools(注意破折号)所需的配置参数。您可以通过执行以下操作查看 kdiff3 设置:

hg config merge-tools | grep -w kdiff3

默认情况下,merge-tools.kdiff3.premerge不应设置,因此hg merge将首先尝试使用其内部合并算法来解决冲突,并且对于无法在没有冲突的情况下解决的文件只回退到 kdiff3(假设您已将其选为合并工具)。通过执行以下操作可以看到如何调用 kdiff3:

hg config merge-tools.kdiff3.args

这里的默认值应该已经非常接近你想要的了。我现在假设您不希望 kdiff3 默认启动,但希望控制何时调用 kdiff3。

如果您不想在存在冲突的情况下默认转储到合并工具中,那么您可以做的是首先与其中一个内部工具合并,我不知道它与您想要的结果有多接近:merge:merge3, 或:fail. 要么 要么:merge:merge3冲突标记放在无法在内部合并的文件中,并将可以合并的文件标记为已解决,其余的标记为未解决。即使冲突可以解决(并且不会添加冲突标记),:fail合并工具也会将所有双方都更改的文件标记为未解决。这可以通过,例如,通过:

hg merge --tool :merge

此时,您将遇到一些 Mercurial 的内部合并工具能够解决的冲突和一些无法解决的冲突(检查hg resolve -l它们的状态或hg resolve -l -T '{ifeq(status,"U","{path}\n","")}'仅列出未解决的文件)。

然后,您可以调用hg resolve --tool kdiff3 FILE--tool kdiff3如果 kdiff3 是您的默认合并工具,也可以省略该选项)来解决FILE. Mercurial 将在调用合并工具之前生成本地、基础和其他修订;作为此过程的一部分,本地文件中的任何冲突标记都将被清除,因为该文件将被工作目录的第一个父目录的新副本替换。

于 2015-12-14T12:45:01.050 回答