265

最近我在使用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 文件中配置什么才能打开具有LOCALREMOTEBASEMERGEDgit mergetool版本的 KDiff3 GUI

  • 如何配置它以将其用作差异工具?

4

8 回答 8

441

这些站点非常有用,几乎是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 工具返回非零退出代码时,使用--trust-exit-code使git-difftool退出。

于 2015-10-26T14:56:01.020 回答
68

只是为了扩展@Jos​​eph 的答案

应用这些命令后,您的全局.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
于 2016-11-26T10:28:05.830 回答
38

对于 Mac 用户

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

(请注意,您可以复制并粘贴它并一次性运行它)

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
于 2018-10-23T04:28:47.843 回答
12

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

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

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

硬解:你应该告诉 Git 在哪里可以找到 KDiff3,方法是指定kdiff3.exe. 不幸的是,Git 不喜欢其配置中路径规范中的空格,所以上次我需要这个时,我最终得到了那些古老的“C:\Progra~1...\kdiff3.exe”,好像它已经晚了1990 年代 :)

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

于 2015-10-23T18:02:19.317 回答
11

2021 年更新:

使用 Windows 上的 Git 2.33(2021 年第三季度),mergetool已经教导 findkdiff3.exe就像它找到winmerge.exe.

git config --global merge.tool kdiff3足够的。

请参阅Michael Schindler ( ) 的提交 47eb4c6(2021 年 6 月 7日(由Junio C Hamano 合并 -- --提交 b7bd70d中,2021 年 7 月 8 日)michaelcompressconsult
gitster

mergetools/kdiff3: 让 kdiff3 在 Windows 上也能工作

签字人:Michael Schindler michael@compressconsult.com

( man )在 Windows 上kdiff3 mergetool找不到本机。 显示消息“ ”。git mergetool
The merge tool kdiff3 is not available as 'kdiff3'

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


2018 年:

要修改kris答案,从 Git 2.20(2018 年第四季度)开始,正确的命令git mergetool

git config --global merge.guitool kdiff3 

那是因为 " git mergetool" 学会了选择 " --[no-]gui" 选项,就像 " git difftool" 一样。

请参阅Denton Liu ( )的提交 c217b93提交 57ba181提交 063f2bd(2018 年 10 月 24 日) 。(由Junio C Hamano 合并——提交 87c15d1中,2018 年 10 月 30 日)Denton-L
gitster

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

根据如何difftool接受-g/--[no-]gui选项,mergetool请接受相同的选项,以便使用merge.guitool变量找到默认的合并工具而不是merge.tool.

于 2018-11-04T03:43:26.443 回答
9

我需要添加命令行参数,否则 KDiff3 只会在没有文件的情况下打开,并提示我输入基本、本地和远程。我使用了TortoiseHg提供的版本。

此外,我需要使用旧的 DOS 8.3 文件名。

[merge]
    tool = kdiff3

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

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

于 2018-06-26T07:21:42.380 回答
7

(当试图从 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 工具的步骤:

  1. 将 kdiff3 安装目录添加到 Windows 路径。
  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
于 2019-04-14T20:10:19.487 回答
0

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

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
于 2022-03-06T00:39:54.527 回答