如何让WinMerge成为我的git mergetool?

Wei*_*Jin 49 git winmerge mergetool difftool

我正在尝试将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"
Run Code Online (Sandbox Code Playgroud)

并使用以下命令.

git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --global difftool.prompt false
Run Code Online (Sandbox Code Playgroud)

错误显示为:

git config option merge.tool set to unknown tool: winmerge
Run Code Online (Sandbox Code Playgroud)

eis*_*eis 62

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

要配置合并工具,您需要使用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
Run Code Online (Sandbox Code Playgroud)

然后你可以使用

git mergetool
Run Code Online (Sandbox Code Playgroud)

这将打开你要编辑的两个文件.

感谢@dvdvck在评论中提到,在命令行参数中,您可以为winmerge(outputpath参数)的结果文件指定第三个文件.

为了完整起见,我会提到还有一个要点是完全配置winmerge作为差异和合并工具.

  • 是的(抄送@RZKY)当在 Windows 中的 bash 中执行此操作时,我还必须转义 $ 符号。NBd。我还发现使用中间的MERGED 文件比使用REMOTE 更容易。我做了: `git config --global mergetool.winmerge.cmd "\"c:\\program files (x86)\\winmerge\\winmergeu.exe\" -e -u -dl \"Base\" -dr \ "Mine\" \"\$LOCAL\" \"\$MERGED\" \"\$REMOTE\""` -- 与 `\$` 的答案相同,并且 MERGED / REMOTE 交换。然后就成功了。(PS 还惊喜地发现,本机路径名甚至可以在 bash 中使用,而不是“/c/Prograblahblah...”)。 (5认同)
  • 在winmerge链接上,它表示仅通过命令行支持3向合并,因此对于git目的,它没问题 (4认同)
  • 根据您使用的shell(例如bash),*$ LOCAL*,*$ REMOTE*和*$ MERGED*的转义可能无法在.gitconfig中生成正确的结果,您可以进入并编辑它手工,但除此之外,上述效果很好. (4认同)

小智 28

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

C:\Program Files (x86)\WinMerge\WinMergeU.exe
Run Code Online (Sandbox Code Playgroud)

在参数中使用:

-e -u -dl "Mine" -wr -dr "Theirs" $LOCAL $REMOTE $MERGED
Run Code Online (Sandbox Code Playgroud)

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

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

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

git config --global mergetool.keepBackup false
Run Code Online (Sandbox Code Playgroud)

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

git config --global --edit
Run Code Online (Sandbox Code Playgroud)

  • 这里还有另一组命令行选项:https://community.atlassian.com/t5/Questions/Can-t-launch-external-merge-tool-WinMerge-on-Windows/qaq-p/315156同样的事情,只是 WinMerge 中的布局略有不同。 (2认同)

Von*_*onC 27

Git 2.5+(2015年第二季度)将包括Winmerge作为众所周知的git mergetool!

如果Winmerge在你的身边%PATH%,那git config merge.tool winmerge就是你需要做的一切!
(它适用于比较工具也:git config diff.tool winmerge)

提交3e4f237大卫·阿吉拉尔(davvid),5月20日到2015年
(由合并JUNIOÇ滨野- gitster-提交324a9f4,2015年6月1日)
的帮助下,通过:菲利普·奥克利(PhilipOakley),约翰内斯Schindelin( )dscho, 塞巴斯蒂安Schuberth( )sschuberth, SZEDERGá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作为内置工具

使用此线程中描述的命令添加winmerge scriptlet ,以便用户可以使用winmerge而无需执行任何其他配置.

  • 该线程还指向[此配置](https://gist.github.com/shawndumas/6158524),这完全解决了我的情况.谢谢, (3认同)

ell*_*eth 14

这是我的(在*%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\"
Run Code Online (Sandbox Code Playgroud)

  • 在配置示例中,WinMerge配置为`difftool`,用于只读查看diff.有关合并的详细信息,请查看@eis的答案. (3认同)
  • 好像我发现了:)这个文件显然在〜/ ​​.gitconfig中,在Windows上似乎是我的用户文件夹即:c:\ users\myuserfolder \ (2认同)

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


Daz*_*Daz 7

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

在 SourceTree Options 对话框中,我选择“Custom”作为合并工具,输入命令为:

C:\Program Files\WinMerge\WinMergeU.exe
Run Code Online (Sandbox Code Playgroud)

参数如下:

-u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED
Run Code Online (Sandbox Code Playgroud)

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

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

命令行参考

我遇到的问题是,当尝试合并时,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 '
Run Code Online (Sandbox Code Playgroud)

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


Tha*_*Mai 6

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

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


Zin*_*Min 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
Run Code Online (Sandbox Code Playgroud)


tra*_*ank 5

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

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

[mergetool "winmerge"]
    cmd = WinMergeU -e -ub -fm -wl -wr $LOCAL $BASE $REMOTE -o $MERGED -am
Run Code Online (Sandbox Code Playgroud)