如何配置kdiff3作为git合并工具而非emerge?

64

我在Mac OSX Snow Leopard上安装了Git,并尝试编辑我的合并和差异工具,以使用kdiff3代替emerge。

但是当我尝试使用它时,它没有启动kdiff的GUI界面,而是一直停留在基于命令行的界面。

我的gitconfig设置如下:

[merge]
     tool = kdiff3
[mergetool "kdiff3"]
    cmd = /Applications/kdiff3.app/Contents/MacOS/kdiff3
    args = $base $local $other -o $output
    trustExitCode = false
[diff]
tool = kdiff3
[difftool "kdiff3"]
cmd = /Applications/kdiff3.app/Contents/MacOS/kdiff3
args = $base $local $other -o $output
trustExitCode = false

显然有一些东西丢失了,但我错在哪里了?


最好附上您用于diff的命令。 - CharlesB
当然,我使用了git difftool -t kdiff3和git mergetool -t kdiff3。 - AKFourSeven
1
刚刚使用brew安装了kdiff3,我的工具可以正常运行,而无需定义[mergetool][difftool]。只需要设置tool = kdiff3即可。你试过这样做吗? - Matt Briançon
2个回答

158

最近的Git版本已经内置了对kdiff3的支持,因此无需使用通用的cmdargs设置手动配置它。而是执行以下操作:

$ git config --global merge.tool kdiff3

如果您的kdiff3不在PATH环境变量中,也需要执行以下操作:

$ git config --global mergetool.kdiff3.path /Applications/kdiff3.app/Contents/MacOS/kdiff3

这会使git mergetool启动kdiff3。请注意,没有办法配置Git在手动合并冲突后自动启动您的合并工具。

如果您真的想看看Git内部如何调用kdiff3,请查看kdiff3的内置合并工具配置

编辑: 对于现在支持Mac OS X的Beyond Compare 4,只需将kdiff3替换为bc3(是的,“3”),并调整上述行中的路径。从Git 2.2.0开始,您将能够使用bc作为bc3的别名,以便您不必担心版本号。


7
我仍需要安装kdiff3。如果你有Homebrew,只需运行“brew install kdiff3”即可轻松完成安装。这应该足以将kdiff3添加到路径中。 - Johnny Oshika
2
git config --global diff.tool kdiff3 - mikelong
1
如果没有配置diff.tool,它会回退到merge.tool,因此只需配置后者即可。 @mikelong - sschuberth
1
@SabaAhang 我的指示适用于任何直接由Git支持的差异/合并工具,包括meld。 支持的工具列表可以从源代码中查看,或者通过运行git mergetool --tool-help来查看。 - sschuberth
按照指示做了一切,但仍然以“mergetool”形式打开终端。 - Farid
显示剩余2条评论

1

最近的Git版本内置了对kdiff3的支持。

是的,但只有Git 2.12(2017年第一季度)才允许这些内置工具信任其退出代码。

查看 提交 2967284, 提交 7c10605 (2016年11月29日) 由 David Aguilar (davvid) 完成。
(由 Junio C Hamano -- gitster -- 合并于 提交 c4a44e2, 2016年12月16日)

mergetool: 为内置工具添加 mergetool.$tool.trustExitCode 配置项

内置合并工具包含一个硬编码的假设,即工具的退出代码是否可信以确定合并的成功或失败。
退出代码不可信的工具在它们的 merge_cmd() 函数中包含对 check_unchanged() 的调用。

问题在于,内置工具未遵循 trustExitCode 配置。

教会内置工具遵循 trustExitCode 配置。

(参见 kdiff3)

扩展run_merge_cmd()函数,使其在工具的退出代码不可信时负责调用check_unchanged()函数。
自脚本片段中删除check_unchanged()的调用,因为它们不再负责调用该函数。

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