最近我在使用GitExtension 2.46,但相同的Git版本是1.9.4.msysgit.2。为了只使用 Git 命令,我卸载了 GitExtension 并安装了最新版本的 Git 和 KDiff3。
当我进行合并并发生冲突时,我运行以下命令:
git mergetool
然后我收到消息:
合并工具 kdiff3 不能作为“kdiff3”使用。
我想它一定是通过 KDiff3 路径。
环境
操作系统:Windows 10
Git 2.6.1.windows.1
KDiff3 0.9.98(64 位)
问题:
我必须在 .gitconfig 文件中配置什么命令 git mergetool 以使用冲突文件的 LOCAL、REMOTE、BASE 和 MERGED 版本打开 KDiff3 GUI?
如何配置它以将其用作差异工具?
git config --global merge.tool kdiff3
就足够了。请参阅my updated answer below
这些网站非常有用,几乎是 mergetool 和 difftool。我使用了全局配置,但存储库可以毫无问题地使用。您只需要执行以下命令:
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 工具返回时执行的操作。从 documentation:
git-difftool 在每个文件上单独调用一个差异工具。默认情况下忽略 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
.gitconfig
文件不是正在使用的文件。请参阅 stackoverflow.com/questions/2114111/… 以识别正在加载的那些。 (2) 不要在 gitconfig 中混用 cmd =
和 path =
,TL;DR:删除 cmd 只使用路径
[diff] tool = kdiff3
对于 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
--add
,因为如果您运行该命令两次,这可能会导致 2 个配置条目。清理它是一团糟,因为您不能再删除单个条目。参见git-scm.com/docs/git-config:“一个选项可以添加多行”
.gitconfig
并删除它们
好吧,问题是 Git 在 %PATH% 中找不到 KDiff3。
在典型的 Unix 安装中,所有可执行文件都驻留在几个众所周知的位置(/bin/
、/usr/bin/
、/usr/local/bin/
等),只需在 shell 处理器中键入程序名称即可调用程序(例如 {4 } :) )。
在 Microsoft Windows 中,程序通常安装在专用路径中,因此您不能简单地在 cmd
会话中键入 kdiff3
并运行 KDiff3。
硬解:您应该通过指定 kdiff3.exe
的完整路径来告诉 Git 在哪里可以找到 KDiff3。不幸的是,Git 不喜欢其配置中路径规范中的空格,所以上次我需要这个时,我最终得到了那些古老的“C:\Progra~1...\kdiff3.exe”,好像它已经晚了1990 年代 :)
简单的解决方案:编辑您的计算机设置并在 %PATH% 中包含带有 kdiff3.exe 的目录。然后测试您是否可以通过其名称从 cmd.exe 调用它,然后运行 Git。
2021 年更新:
对于 Windows 上的 Git 2.33(2021 年第 3 季度),mergetool
被教导要找到 kdiff3.exe
,就像它找到 winmerge.exe
一样。
git config --global merge.tool kdiff3
就足够了。
请参阅 Michael Schindler (michaelcompressconsult
) 的commit 47eb4c6(2021 年 6 月 7 日)。
(由 Junio C Hamano -- gitster
-- 在 commit b7bd70d 中合并,2021 年 7 月 8 日)
mergetools/kdiff3:使 kdiff3 也可以在 Windows 上工作签名者:Michael Schindler michael@compressconsult.com
git mergetool(man) 在 Windows 上找不到本机 kdiff3 合并工具。显示消息“合并工具 kdiff3 不可用,因为 'kdiff3'”。就像我们翻译二进制文件的名称并在 WinMerge 的搜索路径中查找它一样,对 kdiff3 执行相同的操作以找到它。
2018 年:
要修改 kris' answer,从 Git 2.20(2018 年第四季度)开始,git mergetool
的正确命令将是
git config --global merge.guitool kdiff3
那是因为“git mergetool
”学会了使用“--[no-]gui
”选项,就像“git difftool
”一样。
请参阅 Denton Liu (Denton-L
) 的 commit c217b93、commit 57ba181、commit 063f2bd(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 只会在没有文件的情况下打开,并提示我输入基本、本地和远程。我使用了 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 时,我最终来到了这里并得到了最后的部分,所以我会为其他在试图找到答案时也跌跌撞撞的人发布我的解决方案)
如何使用 kdiff3 作为 WSL git 的 diff/merge 工具
使用 Windows 更新 1903 会容易得多;只需使用 wslpath,无需将 TMP 从 Windows 共享到 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 工具的步骤:
将 kdiff3 安装目录添加到 Windows 路径。将 TMP 添加到 WSLENV Windows 环境变量 (WSLENV=TMP/up)。 TMP 目录将被 git 用于临时文件,例如文件的先前版本,因此路径必须在 windows 文件系统上才能正常工作。在 .bashrc 中将 TMPDIR 设置为 TMP:
# If TMP is passed via WSLENV then use it as TMPDIR
[[ ! -z "$WSLENV" && ! -z "$TMP" ]] && export TMPDIR=$TMP
调用 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
git config --global --add diff.guitool kdiff3
更改为:git config --global --add diff.tool kdiff3
--add
将在多次调用时添加第二个或第三个条目。这很难在以后修复,因为它不能简单地用--remove
删除。只需设置一个没有--add
的值就可以了。