Git:如何将KDiff3配置为合并工具和差异工具


218

最近,我正在使用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 LOCALREMOTEBASE已合并冲突的文件吗?

  • 如何配置它以使用具有差异工具?


相关的帖子-一般如何在Git中配置diff工具
RBT

Answers:


373

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

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

trustExitCode选项的使用取决于diff工具返回时要执行的操作。从文档

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


5
仍然,如果kdiff3失败,为什么还要git-difftool不退出?
大卫·托雷斯

9
为了让差异工具能够被Visual Studio 2015识别,我必须将这一行更改 git config --global --add diff.guitool kdiff3 为: git config --global --add diff.tool kdiff3
Guillaume Raymond

2
@DavidTorres可能是因为行为不佳的Windows工具(成功退出并以非零代码退出)对所有人都造成了破坏。
马修·弗拉申

2
根据引用的文档,将trustExitCode设置为false是不必要的,因为默认情况下还是会忽略它。
马特·威尔基

7
AFAIK,--add将在多次调用时添加第二个或第三个条目。以后很难修复,因为不能简单地用删除--remove。只需设置一个不带的值就--add可以了。
Thomas Weller

58

只是为了扩展@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

@ Alex78191,我的回答反映了约瑟夫的回答,您可以在此处找到有关此设置的更多详细信息。
伊戈尔·科斯托夫

5
我花了很长时间才做对了。两件事使我误入歧途:(1).gitconfig我正在编辑的文件不是正在使用的文件。请参阅stackoverflow.com/questions/2114111/…以标识正在加载的对象。(2)不要混搭cmd =,并path =在gitconfig,TL; DR:删除CMD,只是使用路径
马特·威尔基

1
现在在git bash上使用.... git difftool <文件名>或简单的git difftool来运行刚刚设置的diff gui kdiff3。
Vivek '18年

32

对于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

4
不要使用,--add因为如果您运行两次命令,可能会导致2个配置项。清理这是一团糟,因为您不能再删除单个条目。参见git-scm.com/docs/git-config:“可以将多个行添加到一个选项中”
Thomas Weller

11

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

在典型的UNIX安装所有可执行驻留在几个众所周知的位置(/bin//usr/bin//usr/local/bin/等),以及一个可以通过简单地在一个壳处理器键入其名称(例如调用一个程序cmd.exe:))。

在Microsoft Windows,程序通常安装在专用的路径,所以你不能简单地键入kdiff3一个cmd会话,并得到KDiff3运行。

困难的解决方案:您应该通过指定的完整路径来告诉Git在哪里可以找到KDiff3 kdiff3.exe。不幸的是,Git在其配置文件中不喜欢路径规范中的空格,所以上一次我需要它时,我最终得到了那些古老的“ C:\ Progra〜1 ... \ kdiff3.exe”,好像已经晚了1990年代:)

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


8

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

另外,我需要求助于旧的DOS 8.3文件名。

[merge]
    tool = kdiff3

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

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


6

为了修改kris答案,从Git 2.20(Q4 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合并--commit 87c15d1中,2018年10月30日)Denton-L
gitster

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

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


5

(当尝试从WSL git中查找如何使用kdiff3时,我在这里结束并获得了最后的文章,因此,我将把我的解决方案发布给在这里寻找答案的其他绊脚石的人)

如何将Kdiff3用作WSL git的差异/合并工具

使用Windows 1903更新,它变得容易得多。只需使用wslpath即可,而无需从Windows与WSL共享TMP,因为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的差异/合并工具的步骤:

  1. 将kdiff3安装目录添加到Windows路径。
  2. 将TMP添加到WSLENV Windows环境变量(WSLENV = TMP / up)。git将TMP目录用于临时文件,例如文件的先前版本,因此该路径必须在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.