每种文件类型的Mercurial合并策略

时间:2011-02-10 21:17:45

标签: mercurial merge

所有

我想使用kdiff合并所有具有特定后缀的文件(比如* .c,*。h),我想做两件事(关闭premerge并使用internal:other)用于所有带有另一个后缀的文件(说* .mdl)。这样做的目的是允许我对特定文件类型使用一种“clobber merge”(即:不可合并的文件,如配置,自动生成的C,模型等)。

在我的.hgrc中,我尝试过:

[merge-tools]
kdiff3=
clobbermerge=internal:other
clobbermerge.premerge = False

[merge-patterns]
**.c = kdiff3
**.h = kdiff3
**.mdl = clobbermerge

但它仍会触发所有文件的kdiff3。想法?

这个的扩展是在目录上执行'clobber merge' - 但是一旦语法清除了文件后缀,dir应该很容易。

2 个答案:

答案 0 :(得分:3)

合并工具可以使用任何可执行文件。要设置始终使用$base覆盖$other的合并工具,您可以使用以下内容:

[merge-tools]
clobbermerge.priority = 100
clobbermerge.premerge = False
clobbermerge.args = $other $output
clobbermerge.executable = <copy executable>

在Windows上使用此策略时,存在一个问题。您不能简单地用<copy executable> shell命令替换copy。出于某种原因,Mercurial无法在此上下文中找到shell命令。我没有在* nix上试过这个。

要解决此问题,您可以创建分发执行复制的批处理文件。它只需要运行:copy %1 %2。放入PATH后,您可以设置clobbermerge.executable=clobber.bat

如果您安装了kdiff3(在Windows上附带TortoiseHg),您可以使用如下配置在没有外部批处理文件的情况下获得相同的结果:

[merge-tools]
clobbermerge.priority = 100
clobbermerge.premerge = False
clobbermerge.args = --auto $base $other $other -o $output
clobbermerge.executable = kdiff3

此配置的关键是args字段:

  • --auto:告诉kdiff3如果没有冲突则不要打开GUI
  • $base $other $other:告诉kdiff3仅使用$other
  • $output:告诉kdiff3输出文件的名称

答案 1 :(得分:0)

根据此Mercurial MergeToolConfiguration page,您应该将interal:other直接放在匹配模式之后:

[merge-patterns]
**.mdl = internal:other