我正在尝试将WinMerge与Git集成,就像我之前在Windows 7 Ultimate上看到其他人所做的那样。
我遵循了以下步骤,但是当我执行默认为 vimdiff 的 git 合并工具时,错误继续出现。
在 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
您正在谈论合并工具,但您(以及其他一些有答案的人)正在将其配置为比较工具。
要配置合并工具,您需要使用 merge.tool
和 mergetool
配置,而不是 diff.tool
和 difftool
,如下所示:
git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd ""C:Program Files (x86)WinMergeWinMergeU.exe" -e -u -dl "Base" -dr "Mine" "$LOCAL" "$REMOTE" "$MERGED""
git config --global mergetool.prompt false
然后你可以使用
git mergetool
这将打开要编辑的两个文件。
值得称赞的是,@dvdvck注释中提到,在命令行参数中,您可以为 winmerge 的结果文件指定第三个文件(输出路径参数)。
为了完整起见,我将提到还有这个要点,旨在将 winmerge 作为 diff 和合并工具的完整配置。
如果您决定使用 SourceTree(或任何使用 SourceTree 的 Google 搜索者),则可以将 WinMerge 用于合并工具,方法是将合并工具设置为自定义,将 Diff Command 指向 WinMergeU.exe,通常:
C:Program Files (x86)WinMergeWinMergeU.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
Git 2.5+(2015 年第 2 季度)将包含 Winmerge 作为已知git mergetool
!
如果 Winmerge 在您的%PATH%
中,您只需git config merge.tool winmerge
!
(它也适用于差异工具:git config diff.tool winmerge
)
参见 commit 3e4f237 by David Aguilar ( davvid
), 20 May 2015.
(由 Junio C Hamano -- gitster
-- 合并于 提交 324a9f4, 01 Jun 2015)
帮助: 菲利普·奥克利 ( PhilipOakley
), 约翰内斯·辛德林 ( dscho
), 塞巴斯蒂安·舒伯特 ( sschuberth
), 塞德尔·加博尔 ( 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 脚本,以便用户可以使用 winmerge,而无需执行任何其他配置。
2023-05-17更新,我认为最好的命令行如下:
"C:/Program Files/WinMerge/winmergeu.exe" -e -u -am -wl -wr -fm -dl "Mine: $LOCAL" -dm "Merged: $BASE" -dr "Theirs: $REMOTE" "$LOCAL" "$BASE" "$REMOTE" -o "$MERGED"
请注意,使用-am
,这意味着"在中间面板上自动合并"."$LOCAL" "$BASE" "$REMOTE"
表示显示三个面板,从左到右,公共基础显示在中间面板中,但 WinMerge 将自动合并它.
-o "$MERGED"
意味着当我们关闭 WinMerge 时,中间面板的内容将写入最终文件(您尝试解决冲突的文件)。
注意:ollydbg23在评论和1853 WinMerge/winmerge
讨论中问道:
有一个问题是,合并后,如果最终文件中仍有冲突,winmerge 剂量不会发出通知。
因此,功能请求 1855。
的(%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 config --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd ""C:path to winmergeWinMergeU.exe" -e -u -dl "Base" -dr "Mine" $LOCAL $REMOTE"
git config --global difftool.prompt false
要将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
我最初对@CapinWinky使用SourceTree中的WinMerge的答案投了赞成票。这个答案仍然有效,但 WinMerge 现在还支持需要其他参数的三向合并。
在"源代码树选项"对话框中,我选择"自定义"作为合并工具,输入命令为:
C:Program FilesWinMergeWinMergeU.exe
和参数为:
-u -fm -wl -wr -dl Remote_RO -dm Local_Merged -dr Base_RO $REMOTE $LOCAL $BASE -o $MERGED
似乎没有必要将远程/本地/基本参数括在引号中以迎合其中带有空格的路径。
此配置用于将中间窗格用作合并的输出文件。
命令行参考
我遇到了一个问题,即尝试合并时,WinMerge无法打开。源树启动 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 文件解决了问题。
你的路径不正确,应该是"/c/Program Files (x86)/WinMerge/WinMergeU.exe"
。
您是在 shell 脚本环境中运行的,而不是本机 Windows 命令提示符。
通过命令行输入设置已被其他答案所涵盖。与 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 变量都只包含文件名。
在安装了 TortoiseGit 和 WinMerge 2.16(此版本支持 3 路合并)后,我发现了 WinMerge 如何将自身集成到 TortoiseGit 中:
D:Program FilesWinMergeWinMergeU.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
如果您决定使用 fork 客户端,则可以使用以下设置:
文件 -> 首选项 ->集成 ->
- 合并工具 ->自定义
合并路径
C:Program FilesWinMergeWinMergeU.exe
参数
-e -u -dl "Mine" -wr -dm "Merged" -dr "Theirs" $LOCAL $MERGED $REMOTE
- 外部比较工具 ->自定义
合并路径
C:Program FilesWinMergeWinMergeU.exe
参数
-u -dl "Local" -dr "Remote" "$LOCAL" "$REMOTE"
在纠缠了一个多小时之后,我安装了 Tortoisegit,到目前为止,它给了我我想要的东西。
Winmerge for Tortoise git 的设置在 http://thoai-nguyen.blogspot.com.au/2012/03/setup-tortoise-git-and-winmerge.html 中描述
示例:
git config --global --add diff.tool winmerge
git config --replace --global difftool.winmerge.cmd ""C:Program Files (x86)WinMergeWinMergeU.exe" -e -u -dl "Base" -dr "Mine" $LOCAL $REMOTE"
git config --global difftool.prompt false
<</div>
div class="one_answers"> 这里唯一一个为我使用 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
因此,我从未使用过三窗口模式进行合并,并且能够在上述帮助下配置所有内容,但是与现在的Winmerge 2.16.16.0一样,我只能使用"打开冲突文件"选项获得所需的行为。它的 git 配置是:
cmd = "c:/Programs/WinMerge/WinMergeU" -e $MERGED
对我来说,这是最好的速度/可用性选项,无需手动处理那些特殊标记......
所以我发现了如何将WinMerge安装到GitConfig作为合并工具和difftool,这是git bash命令的步骤:
- 在 GitConfig 中设置合并工具
git config --global merge.tool WinMerge
- 设置 WinMerge
- 路径,根据您的 WinMerge 安装位置,我的在程序文件中
git config --global mergetool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"
- 将 mergetool.prompt 设置为 false
git config --global mergetool.prompt false
- 在 git 配置中设置差异工具
git config --global diff.tool WinMerge
- 设置扩散工具路径,
git config --global difftool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"
- 将扩散工具提示设置为 false
git config --global difftool.prompt false
现在您可以执行以下操作:
- git 合并工具
- git difftool
幸福地:)