在Windows上使用Meld作为Git合并工具

105
在Linux中,我最喜欢的合并工具是Meld,并且我在使用它与Git配合使用时没有遇到任何问题。然而,在Windows中情况就不同了。
首先,我从这里找到的一个软件包安装了Meld:https://code.google.com/p/meld-installer/ 然后,我像这样配置了我的.gitconfig文件,以支持Meld作为默认合并工具。
[merge]                                                      
    tool = meld                                                                         

[mergetool "meld"]                                           
    path = C:\\Program Files (x86)\\Meld\\meld\\meld.exe
    keepBackup = false                                   
    trustExitCode = false

所以,当我遇到冲突时,我会使用git difftool,Meld确实会打开。 但是,Git写入传递给diff工具的文件路径是不正确的。例如,即使Git在存储库目录中生成了BASE、LOCAL和REMOTE文件(我从中调用git mergetool的位置),Meld仍然尝试在可执行文件的目录中打开每个文件。

与其打开C:\repo\roses.txt.LOCAL.2760.txt,Meld尝试打开C:\Program Files (x86)\Meld\meld\roses.txt.LOCAL.2760.txt。

有没有人遇到过这种情况或者知道如何在Windows上配置Git/Meld以正确工作?


我不知道这是否有任何尝试的意义,但我使用KDiff3,而在我的gitconfig中设置的路径是:path = C:/Program Files (x86)/KDiff3/kdiff3.exe 而不是C:\等。 - Fumler
1
你能解决这个问题吗? - Roger
1
我一直无法做到。其中一个答案可能是正确的,但我不确定是否应该标记任何一个,因为我实际上无法使Meld正常工作 :-/ - Nelson
@Nelson 别担心,我也不行 :( - abergmeier
请评论并投票支持上游问题,这样未来的用户就不必担心这个问题了。 - Franklin Yu
9个回答

166

为什么你不使用Windows的Git Bash?

安装meld之后,简单地执行以下命令:

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe" <- path to meld here

就是这样了!


2
这个解决方案对我有用,我还执行了下面的命令,以便每次打开工具时不提示我: git config --global mergetool.prompt false - Vineel
2
这个解决方案适用于我使用的 Meld 3.16.2,还添加了 git config --global mergetool.keepBackup false 来删除那些烦人的备份文件。 - Jay
3
由于某种原因,使用这个解决方案后,所有内容都变成了红色(已更改),我不得不执行以下操作:git config --global mergetool.meld.cmd '"C:\Program Files (x86)\Meld\Meld.exe" $BASE $LOCAL $REMOTE -o $MERGED' - ihadanny
7
使用这个解决方案,我得到了“无法导入:GTK+”和“DLL加载失败”的错误信息。 - Juergen
4
这个问题的原因是路径不匹配。如果你将位于lib目录下的libgirepository-1.0-1.dll文件复制到上一级目录(也就是Meld.exe所在的同一目录),然后启动程序,你会发现问题解决了。 - demongolem
显示剩余3条评论

28

小心空格字符在目录中的影响!

[merge]
    tool = meld
[mergetool "meld"]
    prompt = false
    keepBackup = false
    keepTemporaries = false
    path = C:/Program Files (x86)/Meld/Meld.exe
    cmd = \"/C/Program Files (x86)/Meld/Meld.exe\" \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"--output=$PWD/$MERGED\"

1
这些修改似乎破坏了解决方案。原始版本对我有效,所以+1。我发现似乎不需要路径行也可以工作。 - vossad01
当我使用cmd而没有使用path,并且使用反引号代替单引号,单引号代替斜杠双引号时,这对我有用。 - sq33G
在Win10 1903和WSL上,我尝试了很多这些配置方法,但git无法调用meld。最终,我将Program_Files_x86 -> 'Program Files (x86)/'建立符号链接,并使用以下代码:path = /mnt/c/Program_Files_x86/Meld/Meld.exe - Bill Hoag

20

如何将meld作为git difftool替代git diff

(还可以参考下面的meld截图):

1. Windows:

下载并安装Git for Windows,其中包括一个"Git Bash"类似Linux终端,可通过在Windows资源管理器中的任何文件夹上右键单击菜单访问。

从这里下载并安装meld: https://meldmerge.org/

然后,在Git for Windows bash终端中使用以下两个命令(如Arugin所说),将meld设置为git difftool,请使用正确的Meld.exe路径。注意:对于旧版本的Windows,您的路径可能是"C:\Program Files (x86)\Meld\Meld.exe"

git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files\Meld\Meld.exe"

或者你可以直接编辑你的C:\Users\YOUR_USER_NAME\.gitconfig文件,并在文件末尾添加以下内容(请注意,这里必须使用双反斜杠[\\]作为路径分隔符!)。注意:对于旧版本的Windows,你的路径可能是C:\\Program Files (x86)\\Meld\\Meld.exe

[merge]
  tool = meld
[mergetool "meld"]
  path = C:\\Program Files\\Meld\\Meld.exe

现在在你的Git for Windows bash终端中调用git difftool,Meld将作为默认的差异工具查看器打开!如果你还不知道:你可以通过在Windows资源管理器中右键单击文件夹并选择--> "Git Bash"或其他名称来打开该终端。

2. Linux:

我也可以把Linux的说明放在这里,方便自己参考:

对于Linux来说,更加简单:

# 1. install meld
sudo apt update
sudo apt install meld
# 2. edit your ~/.gitconfig file (gedit GUI editor will open)
gedit ~/.gitconfig

然后将以下内容添加到.gitconfig文件的底部:
[diff]
    tool = meld

就是这样!在Linux Ubuntu上,git difftool现在可以使用了!
3. Mac OS
在Mac OS上安装Meld:https://superuser.com/questions/360007/how-to-install-meld-with-homebrew-on-mac-osx/1177575#1177575
Meld的示例截图。

https://istack.dev59.com/sNR7J.webp

(来源) 输入图片描述

Meld 的使用

# 1. See changes you've made since your last commit (do this in place of 
# `git diff`)
git difftool

# 2. Calling meld directly to compare two files:
meld path/to/file1.txt path/to/file2.txt

在本地机器上使用 meld 来审查他人的 GitHub PR

注意:以下命令假设对方的分支与你的代码库在同一个仓库中,因为你们是队友。如果不是这种情况,你需要稍微修改命令,从对方的 forked 仓库中检出分支,而不是从共同的仓库中检出。当在线查看 PR 时,GitHub 会显示他们推荐的检出分支的命令。

  1. 只有命令
    git fetch origin someone_elses_branch
    git checkout someone_elses_branch
    git difftool main...HEAD  # 3个点,不是2个!    
    
  2. 带有详细注释的命令
    # 1. 将他们的远程更改从远程存储的隐藏分支`origin/someone_elses_branch`拉取到您的本地机器上
    git fetch origin someone_elses_branch
    # 2. 在本地检出此分支(这将从本地存储的远程跟踪隐藏分支`origin/someone_elses_branch`创建名为`someone_elses_branch`的本地存储分支)
    git checkout someone_elses_branch
    # 3. 进行差异工具比较(现在使用meld)以查看从他们上次检出并从`main`分叉的点开始在此分支上进行的更改。此命令(使用3个点)相当于`git difftool $(git merge-base main HEAD) HEAD`。
    git difftool main...HEAD  # 3个点,不是2个!
    

相关:

  1. 关于如何使用 meld 比较二进制文件、十六进制文件和 Intel hex 固件文件的问题,我的回答是 在这里
  2. 3个点与2个点的区别:Git diff 提交范围中双点 ".." 和三点 "..." 的区别
  3. [我关于 git blametool 的回答]:是否有类似 bzr qannotate 的 git blame 图形界面工具?
  4. 从这里下载并安装 meld:https://meldmerge.org/
  5. [我的回答]:如何让 Git 使用我选择的编辑器来编辑提交信息?
  6. [我的仓库]:https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
  7. 在 Mac OS 上安装 Meld:https://superuser.com/questions/360007/how-to-install-meld-with-homebrew-on-mac-osx/1177575#1177575

10

我遇到了完全相同的问题,发现必须采取强制措施才能使它正常工作。下面是我在.gitconfig文件中添加的内容。(请注意我的meld可执行文件位于不同的位置)

[merge]
    tool = meld
[mergetool "meld"]
        cmd = "/c/Meld/meld/meld.exe $PWD/$LOCAL $PWD/$BASE $PWD/$REMOTE --output=$PWD/$MERGED"

对我来说,使用我选择的自定义安装路径完全没有问题。值得注意的是,“path”(大多数指南使用)和“cmd”(在此处指定)之间存在差异。 - FauxFaux
我已经尝试了你和马丁的解决方案,但都没有起作用。我认为还有其他问题。一个窗口会打开然后立即关闭,然后Meld会以指向Meld安装目录而不是repo的路径打开。传递给Meld的参数可能导致其崩溃,然后检测到问题并使用默认路径重新启动吗?我在这里摸索,但不确定如何进行故障排除... - Nelson
你确定你正在使用的是meld.exe而不是(meld文件)在(bin文件夹中,我想)的meld文件。我记得曾经遇到过一个问题,我只使用了meld文件,它会在git有机会将文件放入临时文件夹之前启动应用程序。 - schuess
我使用了你的解决方案,但是在bin目录中使用了meld文件(实际上我将文件重命名为meld.py),它可以正常工作。 - Jarrett

4

我也遇到了类似的问题。操作系统使用的是Windows 10,对我有用的是以下更改。看起来更像是路径问题。

git config --global mergetool.meld.path "/c/Program Files (x86)/Meld/Meld.exe" <- path to meld here

4

出于某些原因,在Windows 10中,安装过程中无法正确设置PATH环境变量,因此会引发奇怪的异常,表示无法在"C:\Program Files (x86)/Meld/bin"目录下找到一些.dll文件。

我的解决方法是在git bash中执行以下命令:

export PATH=$PATH:"/C/Program Files (x86)/Meld/lib" 

或将其添加到 Windows PATH 中

C:\Program Files (x86)/Meld/bin

4
我在meld安装程序的错误报告中找到了解决方案,该报告位于以下页面:https://code.google.com/p/meld-installer/issues/detail?id=11。据我所知,问题在于meld.exe程序(通过Python解释器运行meld)不必要地将命令的工作目录设置为meld.exe的目录。这会导致相对路径在作为命令行参数传递时被错误地解释。解决方案是使用AHK2EXe(AutoHotKey脚本-> exe)编译meld.ahk文件生成提供的meld.exe。只需下载页面最下面的脚本即可,因为该页面发布了几个版本。

3
问题跟踪器没有设置自动分配问题给我,所以我错过了这些评论。对于后来找到这篇文章的谷歌员工们,这个问题已经被修复。 - Keegan

2

对我来说,这些答案都没有用。最终我在.gitconfig文件中加入了以下内容:

Original Answer翻译成"最初的回答"

[merge]
  tool = meld
[mergetool "meld"]
  cmd = 'C:/Program Files (x86)/Meld/Meld.exe' $LOCAL $BASE $REMOTE --output=$MERGED
[mergetool]
  prompt = false

当使用git merge mybranch合并分支时,如果出现冲突,只需键入git mergetool,meld将会打开。保存后,您需要在git中提交更改以解决冲突。

但是值得注意的是,这种方法只适用于Meld 3.18.x版本,Meld 3.20.x版本可能会出现错误。

"Original Answer"翻译成中文为"最初的回答"。


0

在尝试了以上所有方法后,将Meld设置为管理员运行对我有用。

  1. 右键单击Meld.exe
  2. 转到属性 > 兼容性并选择以管理员身份运行此程序复选框

我收到的错误引用了像c:\windows\temp\meld-*这样的临时文件,但这些文件并没有被创建。提升Meld的权限似乎是解决问题的关键,因为现在它可以与git difftool一起使用,并且可以在Meld内手动运行。


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