【问题标题】:How can I make WinMerge my git mergetool?如何让 WinMerge 成为我的 git 合并工具?
【发布时间】:2012-05-29 15:30:25
【问题描述】:

我正在尝试将 WinMerge 与 Git 集成,正如我之前在 Windows 7 Ultimate 上看到的其他人所做的那样。

我已按照以下步骤操作,但是当我执行默认为 vimdiff 的 git mergetool 时,仍然会出现错误。

在 git 的根目录:C/Program Files (x86)/Git/ 中创建了一个名为 winmerge.sh 的文件,其中:WinMergeU 是正确的位置。

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" 
git /e /u /dl "Base" /dr "Mine" "$1" "$2"

并使用了以下命令。

git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false

错误显示为:

git config option merge.tool set to unknown tool: winmerge

【问题讨论】:

  • 您的 $PATH 中是否提供 winmerge.sh?什么命令给你这个错误(错误显示为:git config option merge.tool set to unknown tool: winmerge)?
  • 注意:使用 Git 2.5+(2015 年第二季度),Winmerge 将成为已知的差异或合并工具!见my answer below

标签: git winmerge difftool mergetool


【解决方案1】:

您在谈论 合并工具,但您(以及其他一些有答案的人)正在将其配置为 diff 工具

要配置合并工具,您需要使用merge.toolmergetool 配置而不是diff.tooldifftool,如下所示:

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false

然后你就可以使用了

git mergetool

这将打开您要编辑的两个文件。

感谢 @dvdvck 在 cmets 中提到在 command line parameters 中您可以为 winmerge 的结果文件指定第三个文件(输出路径参数)。

为了完整起见,我要提一下 this gist 旨在完整配置 winmerge 作为 diff 和合并工具。

【讨论】:

  • 在 winmerge 链接上,它说只支持通过命令行进行 3 路合并,所以对于 git 目的来说没关系
  • 根据您使用的 shell(例如 bash),$LOCAL$REMOTE$ 的转义MERGED 可能不会在你的 .gitconfig 中产生正确的结果,你可以进去手动编辑它,但除此之外,上面的效果很好。
  • 详细说明@AndrewTheken 评论:mergetool.winmerge.cmd 的上述配置命令可在 Windows 命令提示符 (cmd.exe) 上正常工作,但不能在 Bash 上正常工作(由于变量扩展而产生不正确的配置)或Powershell(由于路径中的 (x86) 部分甚至无法运行)。
  • @dvdvck 从 2.16.0(4 天前发布)开始,它完全支持 3 路合并(也在 GUI 中)。
  • 要让它在 Powershell 中工作,只需用单引号替换最外面的双引号。
【解决方案2】:

如果您决定使用 SourceTree(或任何使用 SourceTree 的 Google 搜索者),您可以将合并工具设置为自定义,将 WinMerge 用于合并工具,将 Diff 命令指向 WinMergeU.exe,通常:

C:\Program Files (x86)\WinMerge\WinMergeU.exe

在参数中使用:

-e -u -dl "Mine" -wr -dr "Theirs" $LOCAL $REMOTE $MERGED

这将导致左侧(标记为“我的”)可编辑,并且当您在 WinMerge 中保存时它将成为输出文件。右侧(标记为“他们的”)将是只读的(即 -wr 参数),这是必需的,因为 WinMerge 将所有保存的文件输出到 $MERGED 文件,因此如果双方都被编辑,它将输出左侧用右侧覆盖它;最好避免这种混乱。

如果您打开备份文件选项,WinMerge 将生成一个 .bak 文件。此文件的内容将是原始左侧文件,或者如果您多次保存,则为倒数第二个输出文件。你可以关闭它,或者将 *.bak 添加到你的 .gitignore 文件中。

Git 本身会在冲突解决后创建一个 *.orig 冲突文件,以防万一你搞砸了。同样,您可以将 *.orig 添加到您的 .gitignore 文件或关闭此功能。不幸的是,SourceTree 没有用于此的 GUI 选项,因此请启动您的 git bash,或者,如果您在安装期间选择了正确的 PATH 选项,请在 Windows 命令提示符下执行以下操作:

git config --global mergetool.keepBackup false

这将停止 Git 创建 *.orig 文件。您还可以通过在用户目录的根目录中找到 .gitconfig 文件来直接编辑配置文件。如果您知道如何使用 VIM,则可以使用以下命令编辑整个内容:

git config --global --edit

【讨论】:

【解决方案3】:

Git 2.5+(2015 年第 2 季度)将包含 Winmerge 作为已知的git mergetool

如果 Winmerge 在您的 %PATH% 中,那么您只需要一个 git config merge.tool winmerge
(它也适用于 diff 工具:git config diff.tool winmerge

参见commit 3e4f237David Aguilar (davvid),2015 年 5 月 20 日。
(由 Junio C Hamano -- gitster -- 合并,commit 324a9f4,2015 年 6 月 1 日)
求助者:Philip Oakley (PhilipOakley)Johannes Schindelin (dscho)Sebastian Schuberth (sschuberth)SZEDER Gábor (szeder)

现在所有配置都直接在 Git 中为您完成,mergetools/winmerge:

  • 差异命令:"$merge_tool_path" -u -e "$LOCAL" "$REMOTE"
  • 合并命令:"$merge_tool_path" -u -e -dl Local -dr Remote "$LOCAL" "$REMOTE" "$MERGED"

mergetools: 将 winmerge 添加为内置工具

使用this thread 中描述的命令添加一个winmerge scriptlet,所以 用户无需执行任何操作即可使用 winmerge 附加配置。

【讨论】:

  • 该线程还指向this configuration,这完全为我解决了这个问题。谢谢,
  • @VonC,你知道如何让 git 显示新添加文件的差异吗?对于新添加的文件,winmerge 会显示一个对话框,其中\\.\nul 作为无效路径之一。所以 winmerge 甚至不显示差异。
  • @hlp 不确定,考虑到差异将是所有文件。考虑为此发布一个单独的问题。
【解决方案4】:

这是我的(在 %userprofile%\.gitconfig 或 *nix 上的 ~/.gitconfig),没有包装器(Win 7 Home Pro):

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = c:/path/to/winmergeu.exe -e -u -x -wl -wr -dl "base" -dr "mine" \"$LOCAL\" \"$REMOTE\"

【讨论】:

  • 我是个 git 新手。看起来它来自某个配置文件(如 .ini 文件)。你能说一下它在哪里吗?
  • 似乎我找到了 :) 这个文件显然在 ~/.gitconfig 中,在 Windows 上它似乎是我的用户文件夹,即:c:\users\myuserfolder\
  • 为什么以只读方式打开文件? (-wl -wr) 直接破坏合并点?
  • 在配置示例中,WinMerge 配置为difftool,用于只读查看差异。有关合并的详细信息,请查看 @eis 的答案。
  • 这是一个 difftool。问题是要求 mergetool
【解决方案5】:

这更容易做到,并且对我有用:

git config --global diff.tool winmerge

git config --replace --global difftool.winmerge.cmd "\"C:\path to winmerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" $LOCAL $REMOTE"

git config --global difftool.prompt false

【讨论】:

  • 我认为在这个版本中 $LOCAL 和 $REMOTE 是互换的。
  • Tom,不仅如此,$REMOTE 和 $LOCAL 变量之前的反斜杠导致 WinMerge 出现问题(我现在使用的是最新版本 2.14.0.0)
  • 我省略了-dl "Base",所以一侧显示了文件名。另一个仍然被标记为"Mine",所以很清楚
【解决方案6】:

将 WinMerge 作为 Visual Studio 2017 Git 插件的比较和合并工具:

在 windows 命令提示符下:输入 >> git config --global --edit 这将打开 .getconfig 文件进行编辑。

请使用以下命令更新:

[mergetool]
   prompt = false
   keepBackup = false
   keepTemporaries = false
[merge]
   tool = winmerge
   [mergetool "winmerge"]
   name = WinMerge
   trustExitCode = true
   cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"
[diff]
   tool = winmerge
   [difftool "winmerge"]
   name = WinMerge
   trustExitCode = true
   cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -u -e $LOCAL $REMOTE

【讨论】:

    【解决方案7】:

    我最初赞成 @CapinWinky 对使用 SourceTree 中的 WinMerge 的回答。该答案仍然有效,但 WinMerge 现在还支持需要附加参数的三向合并。

    在 SourceTree 选项对话框中,我选择“自定义”作为合并工具,输入命令为:

    C:\Program Files\WinMerge\WinMergeU.exe
    

    参数如下:

    -u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED
    

    似乎没有必要将远程/本地/基本参数括在引号中,以适应其中包含空格的路径。

    此配置用于将中间窗格用作合并输出文件。

    Command line reference

    我遇到的问题是,在尝试合并时,WinMerge 无法打开。 Sourcetree 启动 Git 以打开您选择的工具。当使用 Sourcetree 的自定义选项时,您的 git 配置文件(例如 C:\Users\Me\.gitconfig)会被修改以添加一个名为“sourcetree”的新合并工具,并且 Git 命令包括 --tool=sourcetree 。在某些时候,.gitconfig 文件没有正确更新,我在该部分中有两条“cmd”行,一条被破坏了:

    [mergetool "sourcetree"]
        cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' -u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED
        trustExitCode = true
        cmd = 'C:/Program '
    

    手动修复 .gitconfig 文件解决了问题。

    【讨论】:

    • 谢谢。这是唯一适用于 Visual Studio 2019 的配置。
    【解决方案8】:

    你的路径不正确,应该是"/c/Program Files (x86)/WinMerge/WinMergeU.exe"

    您在 shell 脚本环境中运行,而不是本机 Windows 命令提示符。

    【讨论】:

      【解决方案9】:

      安装 TortoiseGit 和 WinMerge 2.16(该版本支持 3 路合并)后,我发现 WinMerge 是如何将自身集成到 TortoiseGit 的:

      D:\Program Files\WinMerge\WinMergeU.exe /e /ub /fm /wl /wr /dl %tname /dm %bname /dr %yname  %theirs %base %mine /o %merged /am
      

      所以我编辑了 .gitconfig 文件并更改了一些变量以使其适合我(我将 WinMerge 目录添加到系统路径):

      [mergetool "winmerge"]
          cmd = WinMergeU -e -ub -fm -wl -wr $LOCAL $BASE $REMOTE -o $MERGED -am
      

      【讨论】:

      • /ub 不是有效标志。此外,我不确定您是否要自动合并基础(/am 标志)。我不认为这有太多意义。虽然我仍然不是 100% 清楚 /ar /am /al 自动合并标志的实际作用。
      【解决方案10】:

      其他答案已涵盖通过命令行输入设置。与 WinMerge 完全 3 路合并的 .gitconfig 文件可以这样配置(此示例来自 Windows):

      [merge]
          tool = WinMerge
      
      [mergetool "WinMerge"]
          cmd = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Local\" -dm \"Base\" -dr \"Remote\" \"$LOCAL\" \"$BASE\" \"$REMOTE\" -o \"$MERGED\"
          trustExitCode = true
          keepBackup = false
      
      [diff]
          tool = WinMerge
      
      [difftool "WinMerge"]
          cmd = \"C:\\Program Files\\WinMerge\\WinMergeU.exe\" -e -u -dl \"Old $BASE\" -dr \"New $BASE\" \"$LOCAL\" \"$REMOTE\"
          trustExitCode = true
      

      标志信息:

      • /e - 允许通过单按“esc”键关闭 WinMerge。
      • /u - 阻止 WinMerge 将文件记录在最近使用的列表中。
      • /dl、/dm 和 /dl - 左侧、中间和右侧窗格的说明。
      • /o - 输出文件。保存 ANY 窗格会将该窗格的内容输出到输出文件。

      trustExitCode = true 告诉 git 在没有进一步提示的情况下接受输出。

      keepBackup = false会自动删除自动生成的*.orig文件。

      注意:使用 difftool 时的 $BASE 和 $MERGE 变量都只包含文件名。

      【讨论】:

      • 非常感谢。我希望我在阅读 /o 标志描述时能多加注意。此回复为我清除了一切。
      【解决方案11】:

      在纠结了一个多小时后,我安装了tortoisegit,到目前为止,它给了我想要的东西。

      Winmerge for Tortoise git 的设置在http://thoai-nguyen.blogspot.com.au/2012/03/setup-tortoise-git-and-winmerge.html 中描述

      【讨论】:

        【解决方案12】:

        例子:

        git config --global --add diff.tool winmerge
        git config --replace --global difftool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" $LOCAL $REMOTE"
        git config --global difftool.prompt false
        

        【讨论】:

          【解决方案13】:

          这是唯一一个使用 Visual Studio 2019 和我的 winmerge 2.16.14.0 为我工作的人: C:\Users\CurrentUserAccount\.gitconfig

          [difftool "winmerge"]
          name = WinMerge
          trustExitCode = true
              cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" -e -u  \"$LOCAL\" \"$REMOTE\"
          [diff]
              tool = winmerge
          [difftool]
              prompt = false
          

          要检查的其他内容:文件 MySolution.git\config(是的,文件名是“config”,没有扩展名): 验证您是否有:

          [diff]
          tool = winmerge
          

          您可以使用以下命令对其进行修改(Visual Studio Menu "Git"\Open in Command Prompt":

          git config diff.tool winmerge
          

          【讨论】:

            猜你喜欢
            • 2011-01-05
            • 1970-01-01
            • 2015-03-07
            • 1970-01-01
            • 2012-04-19
            • 2018-10-06
            • 2016-01-23
            • 2011-05-02
            • 2013-03-14
            相关资源
            最近更新 更多