如何使 WinMerge 成为我的 git 合并工具



我正在尝试将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.toolmergetool 配置,而不是 diff.tooldifftool ,如下所示:

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命令的步骤:

  1. 在 GitConfig 中设置合并工具

git config --global merge.tool WinMerge

    设置 WinMerge
  1. 路径,根据您的 WinMerge 安装位置,我的在程序文件中

git config --global mergetool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"

  1. 将 mergetool.prompt 设置为 false

git config --global mergetool.prompt false

  1. 在 git 配置中设置差异工具

git config --global diff.tool WinMerge

  1. 设置扩散工具路径,

git config --global difftool.WinMerge.path "C:\Program Files\WinMerge\WinMergeU.exe"

  1. 将扩散工具提示设置为 false

git config --global difftool.prompt false

现在您可以执行以下操作:

  1. git 合并工具
  2. git difftool

幸福地:)

相关内容

  • 没有找到相关文章

最新更新