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

Jos*_*eph 196 git mergetool git-merge kdiff3

最近我使用的是GitExtension 2.46,但具有相同功能的Git版本是1.9.4.msysgit.2.我只想使用Git命令,我卸载了GitExtension并安装了GitKDiff3的最新版本.

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

$ git mergetool
Run Code Online (Sandbox Code Playgroud)

然后我收到消息:

合并工具kdiff3不能用作'kdiff3'.

我猜它必须是KDiff3路径.

环境

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

问题:

  • 我必须在.gitconfig文件中配置如何$ git mergetool使用版本LOCAL,REMOTE,BASEMERGED冲突文件打开KDiff3 GUI 的命令?

  • 如何配置它使用它有diff-tool?

Jos*_*eph 339

这些网站非常有用,几乎是mergetooldifftool.我使用了全局配置,但可以在没有问题的情况下由存储库使用.您只需执行以下命令:

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
Run Code Online (Sandbox Code Playgroud)

trustExitCode选项的使用取决于diff工具返回时您想要执行的操作.来自文档:

git-difftool在每个文件上单独调用diff工具.默认情况下会忽略diff工具报告的错误.当调用的diff工具返回非零退出代码时,使用--trust-exit-code使git-difftool退出.

  • 对于我有Visual Studio 2015识别的diff工具,我不得不将这行`git config --global --add diff.guitool kdiff3`更改为:`git config --global --add diff.tool kdiff3` (8认同)
  • AFAIK,` - add`将在多次调用时添加第二个或第三个条目.以后很难修复,因为它不能简单地用`--remove`删除.只设置一个没有`--add`的值应该没问题. (6认同)
  • 不过,为什么我希望git-difftool在kdiff3失败时不退出? (5认同)
  • 好点@ThomasWeller,答案已更新以反映您的建议 (3认同)
  • @DavidTorres可能是因为表现不佳的Windows工具(成功时以非零代码退出)会毁掉每个人. (2认同)
  • 根据引用的文档设置,trustExitCode为false是不必要的,因为默认情况下无论如何都要忽略它. (2认同)

Igo*_*tov 55

只是为了扩展@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
Run Code Online (Sandbox Code Playgroud)

  • 我花了很长时间才能做到这一点.2件事让我误入歧途:(1)我正在编辑的`.gitconfig`文件是_not_正在使用的文件.请参阅/sf/ask/147987801/以识别正在加载的那个.(2)不要在gitconfig,TL中混用和匹配`cmd =`和`path =`; DR:删除cmd并只使用路径 (5认同)

kri*_*ris 27

对于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
Run Code Online (Sandbox Code Playgroud)

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

use*_*253 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.


col*_*ola 7

(当我试图从 WSL git 中找出如何使用 kdiff3 时,我最终到了这里并得到了最后的部分,所以我会发布我的解决方案,供其他人在试图找到答案时也绊倒在这里)

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

使用 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
Run Code Online (Sandbox Code Playgroud)

Windows 更新 1903 之前

使用安装在 Windows 10 上的 kdiff3 作为 WSL 中 git 的差异/合并工具的步骤:

  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
Run Code Online (Sandbox Code Playgroud)
  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
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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
Run Code Online (Sandbox Code Playgroud)


mar*_*tin 5

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

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

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    cmd = /c/Progra~1/TortoiseHg/lib/kdiff3.exe $BASE $LOCAL $REMOTE -o $MERGED
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 5

为了修改kris答案,从Git 2.20(Q4 2018)开始,正确的命令git mergetool

git config --global merge.guitool kdiff3 
Run Code Online (Sandbox Code Playgroud)

这是因为“ 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