【问题标题】:Git: How can I configure KDiff3 as a merge tool and diff tool?Git:如何将 KDiff3 配置为合并工具和差异工具?
【发布时间】:2016-01-23 08:27:46
【问题描述】:

最近我在使用 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 配置什么才能打开具有 LOCALREMOTEBASE 版本的 KDiff3 GUI MERGED 冲突文件?

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

【问题讨论】:

标签: git git-merge kdiff3 mergetool


【解决方案1】:

2021 年更新:

使用 Git 2.33(2021 年第三季度),在 Windows 上,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 mergetool
显示消息“The merge tool kdiff3 is not available as '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 c217b93commit 57ba181commit 063f2bd(2018 年 10 月 24 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 87c15d1,2018 年 10 月 30 日)

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

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

【讨论】:

    【解决方案2】:

    这些网站非常有用,几乎是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 工具返回时执行的操作。来自documentation

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

    【讨论】:

    • 不过,如果 kdiff3 失败,为什么我不希望 git-difftool 退出?
    • 为了让 Visual Studio 2015 识别 diff 工具,我必须将此行 git config --global --add diff.guitool kdiff3 更改为:git config --global --add diff.tool kdiff3
    • @DavidTorres 可能是因为表现不佳的 Windows 工具(成功时以非零代码退出)毁了所有人。
    • AFAIK, --add 将在多次调用时添加第二个或第三个条目。这很难在以后修复,因为它不能简单地用--remove 删除。只需设置一个没有--add 的值就可以了。
    • 好点@ThomasWeller,答案已更新以反映您的建议
    【解决方案3】:

    (当我试图从 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
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 不要使用--add,因为如果您运行该命令两次,这可能会导致 2 个配置条目。清理它是一团糟,因为您不能再删除单个条目。见git-scm.com/docs/git-config:“一个选项可以添加多行”
      【解决方案5】:

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

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

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

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

      【讨论】:

        【解决方案6】:

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

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

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

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • @Alex78191,我的回答反映了约瑟夫的回答,您可以在那里找到有关此设置的更多详细信息。
          • 我花了很长时间才把它弄好。有两件事让我误入歧途:(1) 我正在编辑的 .gitconfig 文件不是正在使用的文件。请参阅stackoverflow.com/questions/2114111/… 以识别正在加载的文件。 (2) 不要在 gitconfig 中混用 cmd =path =,TL;DR:删除 cmd 只使用路径
          • 现在在 git bash 上使用 .... git difftool 或简单的 git difftool 来运行你刚刚设置的 diff gui kdiff3。
          • 对于视觉工作室也添加这个:[diff] tool = kdiff3
          猜你喜欢
          • 2023-02-01
          • 2011-06-15
          • 1970-01-01
          • 2010-10-23
          • 1970-01-01
          • 2011-12-18
          • 2013-07-05
          • 2016-01-27
          相关资源
          最近更新 更多