当与Mercurial执行合并时,它希望一次合并一个冲突文件,这对于大型合并集来说不是一个高效的工作流程。相反,我想要做的是合并两个头的整个变化集(比如使用kdiff3来区分2个头)。对我来说听起来很简单,但我无法弄清楚如何实现它。
到目前为止,我能得到的最接近的是以通常的方式完成合并,让所有冲突得不到解决(一次一个文件......),然后hg vdiff -rHead1 -rHead2
- 但是vdiff(使用kdiff3) )似乎没有传递工具输出目录(当前工作目录)的选项,而是以输出目录作为tempdir启动(可能是-o是答案?)。
让我换一种说法 - 我想用kdiff将两个头合并到我的工作目录中。我希望我的工作目录中的结果成为我可以提交的合并。
我一定错过了一些明显的东西,我不可能是唯一一个想要这样做的人。
答案 0 :(得分:4)
我想出了一个能够实现我想要的解决方案,但我仍然觉得这是一个很好的解决方案。
hg update [My head's rev here]
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
现在我可以处理包含未解析文件的整个目录,并根据需要进行项目范围的更改(即,可能解析一个文件需要在另一个文件中进行其他更改)。
hg resolve -m
呼!这里希望这有助于其他人!
答案 1 :(得分:3)
我几天前在irc.freenode.net上将问题转发给#mercurial
。 mpm
(Mercurial的作者)给出了一个答案(这只是答案的一半,所以我没有立即将它传递到这里)。他说,你可以做一些让Mercurial自动合并文件的东西(并在有冲突的地方插入<<<<
和>>>>
合并标记)。
然后使用了解这些标记的合并工具:这将允许您一次解决所有这些标记,而不是逐个文件地执行它们。起点是merge tool configuration上的页面。它解释了
[ui] merge = internal:merge
将使Mercurial插入合并标记。在这里,我通过制作两个文件x.txt
和y.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 - 排除与给定模式匹配的排除名称