我想使用 kdiff3 合并 mercurial 中的一些内容。因此我安装了 kdiff3 并将以下内容添加到~/.hgrc
:
[extdiff]
cmd.kdiff3 =
[merge-tools]
kdiff3.args = $base $local $other -o $output
但是 Mercurial 一直调用 FileMerge 作为合并工具。我首先检查了 kdiff3 是否正常工作。从 Spotlight 调用它打开了它。然后我从命令行调用它以检查 HG 是否无法调用它,但这也有效。然后我在某处找到了传递完整路径的提示.hgrc
:
[extdiff]
cmd.kdiff3 = /Applications/kdiff3.app/Contents/MacOS/kdiff3
但这也无济于事。当 Mercurial 想要打开合并工具时,kdiff3 也没有错误消息,只有 FileMerge 的一些奇怪错误。
问题是:为什么 Mercurial 拒绝打开 kdiff3?
答案1
感谢 stack exchange 上一位最有礼貌的用户的不懈努力,我终于发现 mercurial wiki 似乎已经过时了。那里它说:
添加到〜/ .hgrc:
[extensions] hgext.extdiff = [extdiff] cmd.kdiff3 = [merge-tools] kdiff3.args = $base $local $other -o $output
不需要 extdiff 扩展,因为我不想hg kdiff3
在这里定义新命令。
但是 Mercurial 对于合并工具还有一些设置:
[ui]
merge = kdiff3
关于Mercurial 关于合并工具的帮助,该ui.merge
设置应该不是必需的,因为我专门设置了一个merge-tools配置:
Mercurial 在决定使用哪种合并工具时使用以下规则:
- 如果已使用 --tool 选项指定了用于合并或解析的工具,则将使用该工具。如果它是 merge-tools 配置中的工具名称,则将使用该工具的配置。否则,指定的工具必须可由 shell 执行。
- 如果存在“HGMERGE”环境变量,则使用其值并且必须可由 shell 执行。
- 如果要合并的文件的文件名与merge-patterns配置部分中的任何模式匹配,则使用与匹配模式相对应的第一个可用合并工具。这里不考虑合并工具的二进制功能。
- 如果设置了 ui.merge,则接下来会考虑它。如果该值不是已配置工具的名称,则使用指定的值,并且该值必须可由 shell 执行。否则,如果命名的工具可用,则使用它。
- 如果合并工具配置部分中存在任何可用的合并工具,则使用优先级最高的工具。
- 如果在系统上可以找到名为“hgmerge”的程序,则会使用它 - 但默认情况下它不会用于符号链接和二进制文件。
- 如果要合并的文件不是二进制文件也不是符号链接,则使用内部“:merge”。
- 文件合并失败,必须在提交之前解决。
我感觉 Mercurial 在此处(或我系统的其他部分)改变了其行为,因为在我使用 kdiff3 的所有机器上,我的 .hgrc 中都没有最后一个设置。但是,添加后就ui.merge
可以了。