如何将KDiff3配置为git的合并工具和diff工具?

最近我在使用GitExtension 2.46,但是Git版本是1.9.4.msysgit.2。为了只使用Git命令,我卸载了GitExtension,并安装了最新版本的GitKDiff3

当我进行合并并且有冲突时,我运行以下命令:

git mergetool

然后我收到了这样的信息:

合并工具kdiff3不能作为'kdiff3'使用。

我猜它肯定是通过KDiff3路径。

环境

  • 操作系统:Windows 10
  • Git 2.6.1.windows.1
  • KDiff3 0.9.98(64位)

问题:

  • 我必须在.gitconfig文件中配置git mergetool命令来打开KDiff3 GUI,版本为冲突文件的当地的远程基地合并后的 ?

  • 我如何配置它使用它作为一个差异工具?

229254 次浏览

好吧,问题是Git无法在%PATH%中找到KDiff3。

在典型的Unix安装中,所有可执行文件都位于几个众所周知的位置(/bin//usr/bin//usr/local/bin/,等等),并且可以通过在shell处理器中键入程序名称来调用程序(例如cmd.exe:))。

在微软Windows中,程序通常安装在专用路径中,因此不能简单地在cmd会话中键入kdiff3并运行KDiff3。

困难的解决方案:你应该通过指定kdiff3.exe的完整路径来告诉Git在哪里找到KDiff3。不幸的是,Git不喜欢在它的配置中的路径规范中使用空格,所以最后一次我需要这个,我最终得到了那些古老的“C:\Progra~1…\kdiff3.exe”,就好像它是90年代末一样:)

简单的解决方案:编辑您的计算机设置并在%PATH%中包含kdiff3.exe目录。然后测试是否可以从cmd.exe中通过名称调用它,然后运行Git。

这些网站非常有用,mergetooldifftool。我使用了全局配置,但是可以被存储库毫无问题地使用。您只需要执行以下命令:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false


git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/bin/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false

注意,最新版本kdiff3将可执行文件从应用程序文件夹C:/Program Files/ kdiff3的根目录移动到应用程序文件夹中的bin/文件夹。如果您使用的是旧版本,请删除“;bin/"从上面的路径。

trustExitCode选项的使用取决于当diff工具返回时你想做什么。从文档:

git-difftool在每个文件上分别调用diff工具。默认情况下,diff工具报告的错误将被忽略。当调用的diff工具返回非零退出码时,使用——trust-exit-code使git-difftool退出。

只是扩展 @Joseph的答案:

应用这些命令后,你的全局.gitconfig文件将有以下几行(为了加快这个过程,你可以把它们复制到文件中):

[merge]
tool = kdiff3
[mergetool "kdiff3"]
path = C:/Program Files/KDiff3/kdiff3.exe
trustExitCode = false
[diff]
guitool = kdiff3
[difftool "kdiff3"]
path = C:/Program Files/KDiff3/kdiff3.exe
trustExitCode = false

我需要添加命令行参数或KDiff3将只打开没有文件,并提示我为基础,本地和远程。我使用了TortoiseHg提供的版本。

此外,我还需要使用老式的DOS 8.3文件名。

[merge]
tool = kdiff3


[mergetool "kdiff3"]
cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED

但是,它现在可以正常工作了。

Mac用户

这是@Joseph接受的答案,但是Mac的默认安装路径位置为kdiff3

(请注意,您可以复制和粘贴这个,并运行它在一个去)

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path  "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global mergetool.kdiff3.trustExitCode false


git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global difftool.kdiff3.trustExitCode false

2021年更新:

在Git 2.33 (Q3 2021)中,在Windows上,mergetool已经被教会像找到winmerge.exe一样找到kdiff3.exe

git config --global merge.tool kdiff3就足够了。

参见提交47 eb4c6 (07 Jun 2021) by 迈克尔·辛德勒(michaelcompressconsult)
(由Junio C Hamano—gitster提交b7bd70d中合并,2008 july 2021)

mergetools/kdiff3:使kdiff3工作在Windows上

署名:Michael Schindler michael@compressconsult.com

Windows上的git mergetool(man)找不到本机kdiff3 mergetool
信息"The merge tool kdiff3 is not available as 'kdiff3'"显示。< / p >

就像我们转换二进制文件的名称并在WinMerge的搜索路径上查找它一样,对kdiff3执行相同的操作以找到它。


2018:

为了修改克丽丝' 回答,从Git 2.20(2018年Q4)开始,git mergetool的正确命令将是

git config --global merge.guitool kdiff3

那是因为"git mergetool"学会了把“--[no-]gui"选项,就像 “git difftool"。< / p >

参见提交c217b93提交57 ba181提交063年f2bd(2018年10月24日)by 刘丹顿(Denton-L)
(由Junio C Hamano—gitster提交87年c15d1中合并,30 Oct 2018)

mergetool:接受-g/--[no-]gui作为参数

difftool接受-g/--[no-]gui选项的方式一致,使mergetool接受相同的选项,以便使用merge.guitool变量来查找默认的合并工具,而不是merge.tool

(当试图从WSL git中找到如何使用kdiff3时,我在这里结束了,并得到了最后的部分,所以我将为其他人发布我的解决方案,同时试图找到答案)

如何使用kdiff3作为WSL git的diff/合并工具

有了Windows更新1903,这就容易多了;只使用wslpath,不需要从Windows共享TMP到WSL,因为Windows端现在可以通过\ WSL $访问WSL文件系统:

[merge]
renormalize = true
guitool = kdiff3
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
# Unix style paths must be converted to windows path style
cmd = kdiff3.exe \"`wslpath -w $LOCAL`\" \"`wslpath -w $REMOTE`\"
trustExitCode = false
[mergetool]
keepBackup = false
prompt = false
[mergetool "kdiff3"]
path = kdiff3.exe
trustExitCode = false

在Windows更新1903之前

使用安装在Windows 10上的kdiff3作为WSL中git的diff/merge工具的步骤:

  1. 将kdiff3的安装目录添加到“Windows Path”中。
  2. 将TMP添加到WSLENV Windows环境变量中(WSLENV=TMP/up)。TMP目录将被git用于临时文件,就像以前修订的文件一样,因此该路径必须在windows文件系统上才能工作。
  3. 在.bashrc中将TMPDIR设置为TMP:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
  1. 调用kdiff3时,将unix-path转换为windows-path。我的.gitconfig示例:
[merge]
renormalize = true
guitool = kdiff3
[diff]
tool = kdiff3
[difftool]
prompt = false
[difftool "kdiff3"]
#path = kdiff3.exe
# Unix style paths must be converted to windows path style by changing '/mnt/c/' or '/c/' to 'c:/'
cmd = kdiff3.exe \"`echo $LOCAL | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\" \"`echo $REMOTE | sed 's_^\\(/mnt\\)\\?/\\([a-z]\\)/_\\2:/_'`\"
trustExitCode = false
[mergetool]
keepBackup = false
prompt = false
[mergetool "kdiff3"]
path = kdiff3.exe
trustExitCode = false

与接受的答案相同,但有新的安装路径,便于复制/粘贴:

git config --global merge.tool kdiff3
git config --global mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global mergetool.kdiff3.trustExitCode false


git config --global diff.guitool kdiff3
git config --global difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global difftool.kdiff3.trustExitCode false