最近我使用的是GitExtension 2.46,但具有相同功能的Git版本是1.9.4.msysgit.2。我只想使用Git命令,我卸载了GitExtension并安装了Git和KDiff3的最新版本。
当我进行合并并发生冲突时,我运行以下命令:
$ git mergetool
然后我收到消息:
合并工具kdiff3不能用作'kdiff3'。
我猜它必须是KDiff3路径。
环境
问题:
$ git mergetool
配置什么才能打开带有冲突文件版本LOCAL,REMOTE,BASE和MERGED的KDiff3 GUI?这些网站非常有用,几乎是mergetool和difftool。我使用了全局配置,但可以在没有问题的情况下由存储库使用。您只需执行以下命令:
git config --global --add merge.tool kdiff3
git config --global --add mergetool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global --add mergetool.kdiff3.trustExitCode false
git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "C:/Program Files/KDiff3/kdiff3.exe"
git config --global --add difftool.kdiff3.trustExitCode false
使用trustExitCode
选项取决于diff工具返回时您想要做什么。来自documentation:
git-difftool在每个文件上单独调用diff工具。默认情况下会忽略diff工具报告的错误。当调用的diff工具返回非零退出代码时,使用--trust-exit-code使git-difftool退出。
只是为了扩展the @Joseph's answer:
应用这些命令后,您的全局.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
这是@Joseph接受的答案,但使用kdiff3
的默认Mac安装路径位置
(请注意,您可以复制并粘贴此内容并一次性运行)
git config --global --add merge.tool kdiff3
git config --global --add mergetool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add mergetool.kdiff3.trustExitCode false
git config --global --add diff.guitool kdiff3
git config --global --add difftool.kdiff3.path "/Applications/kdiff3.app/Contents/MacOS/kdiff3"
git config --global --add difftool.kdiff3.trustExitCode false
好吧,问题是Git在%PATH%中找不到KDiff3。
在典型的Unix安装中,所有可执行文件都驻留在几个众所周知的位置(/bin/
,/usr/bin/
,/usr/local/bin/
等),并且可以通过在shell处理器中简单地键入其名称来调用程序(例如cmd.exe
:))。
在Microsoft Windows中,程序通常安装在专用路径中,因此您不能简单地在kdiff3
会话中键入cmd
并运行KDiff3。
硬解决方案:你应该通过指定kdiff3.exe
的完整路径告诉Git在哪里找到KDiff3。不幸的是,Git不喜欢其配置中的路径规范中的空格,所以我最后一次需要它时,我最终得到了那些古老的“C:\ Progra~1 ... \ kdiff3.exe”,好像它已经晚了1990年代:)
简单的解决方案:编辑计算机设置,并在%PATH%中包含kdiff3.exe的目录。然后测试是否可以通过名称从cmd.exe调用它,然后运行Git。
要修改kris'answer,从Git 2.20(Q8 2018年)开始,git mergetool
的正确命令将是
git config --global merge.guitool kdiff3
那是因为“git mergetool
”学会采取“--[no-]gui
”选项,就像“git difftool
”一样。
参见commit c217b93,commit 57ba181,commit 063f2bd,Denton Liu (Denton-L
)(2018年10月24日)。
(由Junio C Hamano -- gitster
--合并于commit 87c15d1,2018年10月30日)
mergetool
:接受-g/--[no-]gui
作为论据根据
difftool
如何接受-g/--[no-]gui
选项,使mergetool
接受相同的选项,以便使用merge.guitool
变量来查找默认的mergetool而不是merge.tool
。
我需要添加命令行参数或KDiff3只打开没有文件并提示我输入base,local和remote。我使用了TortoiseHg提供的版本。
另外,我需要求助于旧的DOS 8.3文件名。
[merge]
tool = kdiff3
[mergetool "kdiff3"]
cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED
但是,它现在正常工作。
(当试图找出如何使用WSL git中的kdiff3时,我最终在这里得到了最后的部分,所以我会发布我的解决方案,其他人也在这里磕磕绊绊,同时试图找到答案)
使用安装在Windows 10上的kdiff3作为WSL中git的差异/合并工具的步骤:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
[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