Msys Git合并工具命令选项问题

20

我正在Windows机器上使用msys Git 作为源代码控制工具,并尝试找出如何让我的合并工具WinMerge与Git一起使用。

我尽最大努力按照这篇博客中的说明进行操作,因为这是我找到的与我的操作最接近的。基本上,我所做的就是:

修改我的.gitconfig文件,加入以下内容:

[merge]
    tool = winmerge

[mergetool "winmerge"]
    cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe\" "$PWD/$LOCAL" "$PWD/$REMOTE" "$PWD/$MERGED"  
        trustExitCode = false  
    keepBackup = false

这个方法几乎可以正常工作。当我尝试从Git运行合并工具时,WinMerge会给我一个错误,说它找不到文件路径,这是完全有道理的,因为它要查找的路径是:

C:\MY\WORKING\DIRECTORY\-e
C:\MY\WORKING\DIRECTORY\-ub

看起来Git将选项传递到合并工具中,而不是我期望的本地和远程文件名。

我在网上搜索了Git合并的文档,但似乎找不到任何与我正在尝试做的相关的信息。我的猜测是解决方案可能是以下之一:

  1. 更改$LOCAL$REMOTE变量的值,假设$LOCAL$REMOTE是不正确的。
  2. 编写一个.bat脚本来调用WinMergeU,并在我的.bat脚本逻辑中处理Git发送到合并工具的参数。
3个回答

12

如果你查看冲突的文件,你会注意到标准的Theirs >>>>>>><<<<<< Mine标记。WinMerge将它们视为合并冲突,因此不需要明确指定'Theirs'和'Mine';只需告诉它具有冲突标记的文件即可。

  1. 我们知道工作目录中的文件含有这些标记。
  2. 合并到的文件也应该是这个文件——我们还知道git mergetool提供了变量$MERGED,它命名了这个文件。

[mergetool "winmerge"]
    cmd = 'C:/Program Files/WinMerge/WinMergeU.exe' \"$MERGED\"
这是将git与WinMerge配合进行合并/冲突解决所需的全部内容;无需脚本或命令行开关。请参阅文档中的第3个命令行表单(由上面的OP链接)和对conflictfile参数的解释。

1
没有正确的路径? 来自WinMerge文档conflictfile指定冲突文件,通常由版本控制系统生成。冲突文件在文件比较窗口中打开,您可以合并和解决冲突,如解决冲突文件中所述。请注意,冲突文件不能与其他路径一起使用。(引用可能有点糟糕)也许你不需要使用最新版本,只需指定一个文件即可。 - Darren Bishop
很高兴能够帮助……你投票了吗,哈哈?我可以问吗? - Darren Bishop
我将这个添加到了我的主目录下的 .gitconfig 文件中(在 Windows 上是 C:\Users\username\),然后就可以开始使用了!谢谢。 - BigBlueHat

7

来自 WinMerge 命令行手册:

cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe /ub /e \"
cmd = \"C:\\Program Files (x86)\\WinMerge\\WinMergeU.exe /u /e \"

最新的WinMerge中,/u代替了/ub。

在您的mergetool部分中,将其作为一个命令可能会更好。

但是,您可能需要将此调用包装在脚本中,如此SO答案所述。

适用于merge.tool的提取内容:

配置您的自定义diff工具与mergetool的实际案例:

C:\myGitRepo>git config --global merge.tool winmerge
C:\myGitRepo>git config --global mergetool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global mergetool.prompt false

如果您将 winmerge.sh 存储在 PATH 的目录中:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -e -ub "$1" "$2"

如果您有另一种工具(如,等),请创建另一个shell脚本,并使用适当的配置指令。
然后您可以使用配置轻松切换工具。

+1。如果可以的话,但至少我可以取消我的踩票...似乎是一个bug。实际上,如果您将winmerge添加到路径中(或设置mergetool.winmerge.path),则不需要脚本。 - Tobias Kienzler
顺便说一下,对于这个问题应该使用“mergetool”,而不是“difftool”。 - Tobias Kienzler
@Tobias:谢谢。答案已更新(使用difftool替换为mergetool)。 - VonC
如果您使用的是x64 Windows,请将Natch添加到路径中。尝试添加编辑以显示.gitconfig文件的外观,如果您编辑它而不是使用“git config --global”三次。在您的.gitconfig中的关键行:在“[merge]”下(如果不存在括号部分,则添加)添加“tool = winmerge”,并在“[mergetool“winmerge”]”下添加“cmd =“wmDiff.sh”$LOCAL”“$REMOTE””然后是“trustExitCode = false”,然后是“keepBackup = false”。此外,在“[mergetool]”下(没有“winmerge”之后;新部分)是“prompt = false”。发现编辑.gitconfig更容易测试/优化选项。 - ruffin

5
[mergetool "winmerge"]
    cmd = winmergeu -e -ub -wl -dl "Remote" -dr "Local" "$PWD/$REMOTE" "$PWD/$LOCAL" "$PWD/$MERGED"
    keepBackup = false

如果你查看 C:\Program Files\Git\share\git-gui\lib\mergetool.tcl,里面包含常见合并工具的语法。

我仍在尝试从 Git GUI 直接调用合并工具...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接