如何让WinMerge成为我的git mergetool?

时间:2012-05-23 05:24:42

标签: git winmerge difftool mergetool

我正在尝试将WinMerge与Git集成,因为我之前在Windows 7旗舰版上看到过其他人。

我已经按照以下步骤进行了操作,但是当我执行git mergetool(默认为vimdiff)时会出现错误。

在git的根目录中创建了一个名为winmerge.sh的文件:C / Program Files(x86)/ Git / with: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

12 个答案:

答案 0 :(得分:58)

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

要配置合并工具,您需要使用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的评论在评论中提到,在command line parameters中你可以为winmerge(outputpath参数)的结果文件指定第三个文件。

为了完整起见,我会提到还有this gist针对完全配置winmerge作为差异和合并工具。

答案 1 :(得分:25)

Git 2.5 +(2015年第二季度)将Winmerge列为已知的git mergetool

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

2015年5月20日commit 3e4f237旁边的David Aguilar (davvid) 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

  • diff命令:"$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而无需执行任何操作   其他配置。

答案 2 :(得分:24)

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

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 :(得分:13)

这是我的(%userprofile%\.gitconfig或* {n}上的~/.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\"

答案 4 :(得分:7)

这样做更容易,对我有用:

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

答案 5 :(得分:4)

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

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

答案 6 :(得分:3)

将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 :(得分:1)

经过一个多小时的麻烦之后,我安装了tortoisegit,到目前为止它正在给我我想要的东西。

http://thoai-nguyen.blogspot.com.au/2012/03/setup-tortoise-git-and-winmerge.html

中描述了Winmerge for Tortoise git的设置

答案 8 :(得分:1)

通过命令行输入设置已被其他答案覆盖。与WinMerge进行完整三向合并的.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变量都只包含文件名。

答案 9 :(得分:1)

在安装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 dir添加到系统路径中):

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

答案 10 :(得分:0)

示例:

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

答案 11 :(得分:0)

我最初赞成@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

似乎不必将remote / local / base参数用引号引起来,以适应其中包含空格的路径。

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

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文件可以解决此问题。