8

在使用 Mercurial 执行合并时,它希望一次合并一个冲突文件,这在大型合并集上不是一个高效的工作流程。相反,我想做的是合并两个头的整个变更集(比如使用 kdiff3 来区分 2 个头)。对我来说,这听起来很简单,但我不知道如何实现它。

到目前为止,我能得到的最接近的方法是以通常的方式进行合并,让所有冲突未解决(一次一个文件......),然后hg vdiff -rHead1 -rHead2- 但 vdiff(使用 kdiff3)似乎没有选项用于向工具传递输出目录(当前工作目录),而是将输出目录作为临时目录启动(可能 -o 是答案?)。

让我换一种说法 - 我想使用 kdiff 将两个头合并到我的工作目录中。我希望我的工作目录中的结果成为我可以提交的合并。

我一定遗漏了一些明显的东西,我不能是唯一一个想要这样做的人。

4

5 回答 5

4

我想出了一个可以实现我想要的解决方案,但我仍然觉得它是一个杂项。

  • 从一个有 2 个头的空工作目录开始:我的和他们的。
  • 将工作目录更新为我的:
    hg update [My head's rev here]
  • 执行合并,但在没有启动合并工具的情况下 Merc 无法自动处理的所有文件失败,并在冲突时保留“我的”文件:
    hg --config "ui.merge=internal:fail" merge

有关如何合并/失败的详细信息, 请参阅https://www.mercurial-scm.org/wiki/TipsAndTricks#head-9f405488b6d3b3d092a09aafa28db515ba44c742 。

现在我已经有了一个 auto 可以计算的工作目录,但是我的任何未处理的文件仍然没有被触及。(使用 hg resolve -l 查看 Mercurial 对当前文件的解析状态)

  • 现在我可以将我的工作目录与他们的头进行对比,这为我提供了我正在寻找的高级别的变更集到变更集的合并。

hg vdiff -r [Theirs head's rev here]

注意:如果您将 WinMerge 用于 vdiffs ,请确保它有一个 /r 开关作为选项,它将进行子目录比较,并且 - 如果 WinMerge 配置设置为使用树视图 - 将提供一个很好的树比较。来自 Mercurial.ini:

[extdiff]
cmd.vdiff = C:\Program Files\WinMerge\WinMergeU.exe
opts.vdiff = /e /ub /r /dl other /dr local

现在我可以处理包含未解析文件的整个目录,并根据需要进行项目范围的更改(即,解析一个文件可能需要对另一个文件进行额外的更改)。

  • 完成后,使用 resolve 标记为 Merc 解析的所有文件,然后提交。
    hg resolve -m

哇!希望这对其他人有帮助!

于 2009-06-17T13:13:12.750 回答
3

#mercurial几天前,我在 irc.freenode.net 上转发了这个问题。mpm(Mercurial 的作者)给出了一个答案(这只是一半的答案,所以我没有立即在这里传递它)。他说可以做一些事情,让 Mercurial 自动合并文件(并在有冲突的地方插入<<<<和合并标记)。>>>>

然后使用了解这些标记的合并工具:这将让您一次解决所有问题,而不是逐个文件地进行。一个起点是合并工具配置页面。它解释说

[用户界面]
合并 = 内部:合并

将使 Mercurial 插入合并标记。在这里,我通过制作两个文件对其进行了测试,x.txt然后y.txt在两个克隆中进行了相互冲突的更改对其进行了修改。合并只是给出了:

% 汞合并
合并 x.txt
警告:合并期间的冲突。
合并 x.txt 失败!
合并 y.txt
警告:合并期间的冲突。
合并 y.txt 失败!
0 个文件已更新,0 个文件已合并,0 个文件已删除,2 个文件未解决
使用“hg resolve”重试未解析的文件合并或“hg up --clean”放弃

所有文件都是一次性处理的,我不需要像你描述的那样确认每个文件的任何内容。

这些文件现在包含如下合并标记:

% cat x.txt
foo
<<<<<<< local
hehe
=======
foobar
>>>>>>> other

下一步是找到一个工具,该工具可以获取包含此类文件的目录树并让您解决它们。我查看了kdiff3,但没有弄清楚如何使用它单独对单个文件进行操作,它似乎非常专注于比较文件/目录对。

我不确定这半个答案对您有多大帮助-也许您此时也陷入困境?但我希望它可以帮助其他想要将合并标记插入所有文件然后手动解决冲突的人。

于 2009-06-03T09:41:16.740 回答
1

我认为回答了你的问题。

于 2009-06-03T00:58:33.257 回答
0

听起来你想要extdiff命令:

我的 ~/.hgrc 中有这些(我更喜欢融合,但你可以将其更改为 kdiff3 等)

[extensions]
hgext.extdiff =

[extdiff]
# add new command called meld, runs meld (no need to name twice)
cmd.meld =

随着extdiff您的合并发生在您的工作目录中,此外,您可以使用 -o 将任何额外参数传递给您的 diff 程序:

$ hg help extdiff

hg extdiff [选择]... [文件]...

使用外部程序来区分存储库(或选定的文件)

Show differences between revisions for the specified files, using
an external program.  The default program used is diff, with
default options "-Npru".

To select a different program, use the -p option.  The program
will be passed the names of two directories to compare.  To pass
additional options to the program, use the -o option.  These will
be passed before the names of the directories to compare.

When two revision arguments are given, then changes are
shown between those revisions. If only one revision is
specified then that revision is compared to the working
directory, and, when no revisions are specified, the
working directory files are compared to its parent.

选项:

-p --program 要运行的比较程序
-o --option 将选项传递给比较程序
-r --rev revision
-I --include 包含与给定模式匹配的
名称 -X --exclude 排除与给定模式匹配的名称

于 2009-06-09T08:45:56.373 回答
0

尝试设置 ui.merge。有关详细信息,请参阅此页面。

于 2009-04-29T22:43:40.803 回答