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

3

大家好:

我想使用kdiff来合并特定后缀的所有文件(例如*.c, *.h),并且我想对另一种后缀(例如*.mdl)的所有文件做两件事情(关闭预合并并使用内部:其他)。这样做的目的是为了允许我针对特定类型的文件使用“覆盖合并”(即无法合并的文件,如配置、自动生成的C代码、模型等)

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

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

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

但是它仍然会触发kdiff3打开所有文件。有什么想法吗?

这个的扩展是对一个目录执行'clobber merge' - 但是一旦文件后缀的语法清楚了,那么目录就很容易了。

2个回答

3
合并工具可以使用任何可执行文件。要设置一个合并工具,始终用$other覆盖$base,您可以使用以下方式:
[merge-tools]
clobbermerge.priority = 100
clobbermerge.premerge = False
clobbermerge.args = $other $output
clobbermerge.executable = <copy executable>

当在Windows上使用此策略时,存在一个问题。您不能仅仅将替换为copy shell命令。由于某些原因,在这种情况下,Mercurial无法找到shell命令。我没有在*nix上尝试过此操作。
要解决此问题,您可以创建并分发执行复制的批处理文件。它只需要运行:copy %1 %2。一旦放置在您的PATH上,您可以设置。
如果您已安装kdiff3(随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输出文件的名称

0

这个问题的关键是我需要关闭 .mdl 文件的 premerge,并应用 internal:other 合并策略。 - dls
如果您使用 internal:other,我想什么也不会合并,而是使用 other 文件?internal:other 只能直接在文件模式之后使用,因此您可能需要添加一个 premerge 钩子?http://www.humbug.in/docs/hgbook/ch10s08.html#sec:hook:preupdate - Veger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接