61

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

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

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

14 回答 14

70

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

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

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 在评论中提到,在命令行参数中,您可以为 winmerge 的结果文件指定第三个文件(输出路径参数)。

为了完整起见,我会提到还有这个要点旨在完整配置 winmerge 作为 diff 和合并工具。

于 2013-05-01T23:04:17.143 回答
39

如果您决定使用 SourceTree(或任何使用 SourceTree 的 Google 搜索者),您可以通过将 Merge Tool 设置为 custom 将 WinMerge 用于 Merge Tool,将 Diff Command 指向 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
于 2014-07-11T16:51:10.380 回答
34

Git 2.5+(2015 年第二季度)将包括 Winmerge 作为一个已知的git mergetool

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

请参阅David Aguilar ( )的提交 3e4f237,2015年5 月 20 日。(由Junio C Hamano 合并——提交 324a9f4中,2015 年 6 月 1 日) 帮助者:Philip Oakley ( )Johannes Schindelin ( )Sebastian Schuberth ( )SZEDER Gábor ( )davvid
gitster
PhilipOakleydschosschuberthszeder

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

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

mergetools: 添加 winmerge 作为内置工具

使用此线程中描述的命令添加一个 winmerge scriptlet ,以便用户无需执行任何额外配置即可使用 winmerge。

于 2015-06-07T22:46:21.247 回答
15

这是我的(在%userprofile%\.gitconfig~/.gitconfig*nix 上),没有包装器(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\"
于 2012-05-23T05:56:25.923 回答
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
于 2013-05-01T02:21:49.040 回答
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
于 2018-07-25T06:54:37.207 回答
5

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

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

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

命令行参考

我遇到的问题是,在尝试合并时,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 文件对问题进行了排序。

于 2019-07-02T12:33:48.773 回答
4

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

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

于 2012-05-23T05:41:20.680 回答
3

安装 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
于 2019-09-12T11:37:50.777 回答
2

其他答案已经涵盖了通过命令行输入设置。与 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 - 输出文件。保存任何窗格都会将该窗格的内容输出到输出文件。

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

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

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

于 2019-03-05T18:04:30.903 回答
1

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

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

于 2014-07-02T14:30:41.990 回答
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
于 2014-10-13T19:07:03.030 回答
0

这是唯一一个使用 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
于 2021-09-24T10:44:11.017 回答
0

因此,我从未使用过三窗口模式进行合并,并且能够在上面的帮助下配置所有内容,但现在使用 Winmerge 2.16.16.0,我只能通过“打开冲突文件”选项获得所需的行为。它的 git 配置是:

cmd = \"c:/Programs/WinMerge/WinMergeU\" -e $MERGED

至于我,这是最好的速度/可用性选项,无需手动处理那些特殊标记......

于 2022-01-14T11:47:51.723 回答