如何进行基于变更集的合并而不是基于Mercurial的基于文件的合并?

时间:2009-04-29 22:04:12

标签: mercurial merge

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

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

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

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

5 个答案:

答案 0 :(得分: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

现在我有一个工作目录,尽可能多的汽车可以弄清楚,但任何优秀的文件仍未触及我的。 (使用hg resolve -l查看Mercurial当前文件的解析状态)

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

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

注意:如果你正在使用WinMerge作为vdiff,那么确保它有一个/ r开关作为选项进行子目录比较 - 如果WinMerge配置设置为使用Tree-View - 将会很好树比较。来自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

呼!这里希望这有助于其他人!

答案 1 :(得分:3)

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

然后使用了解这些标记的合并工具:这将允许您一次解决所有这些标记,而不是逐个文件地执行它们。起点是merge tool configuration上的页面。它解释了

[ui]
merge = internal:merge

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

% hg merge
merging x.txt
warning: conflicts during merge.
merging x.txt failed!
merging y.txt
warning: conflicts during merge.
merging y.txt failed!
0 files updated, 0 files merged, 0 files removed, 2 files unresolved
use 'hg resolve' to retry unresolved file merges or 'hg up --clean' to abandon

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

文件现在包含合并标记,如下所示:

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

下一步是找到一个工具,可以将目录树与这些文件一起使用并让您解决它们。我查看了kdiff3,但没有弄清楚如何单独使用它来操作单个文件,它似乎非常专注于比较文件/目录对。

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

答案 2 :(得分:1)

我认为this会回答你的问题。

答案 3 :(得分:0)

尝试设置ui.merge。有关详细信息,请参阅this page

答案 4 :(得分:0)

听起来像你想要extdiff命令:

我在〜/ .hgrc中有这些(我更喜欢meld,但你可以把它改成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 [OPT] ... [文件] ......

     

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

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 - 程序比较程序运行
   -o - 选项传递选项到比较程序
   -r --rev revision
   -I - 包括包含与给定模式匹配的名称
   -X - 排除与给定模式匹配的排除名称