在 Windows 上使用 Meld 的 Git 合并工具
Posted
技术标签:
【中文标题】在 Windows 上使用 Meld 的 Git 合并工具【英文标题】:Git mergetool with Meld on Windows 【发布时间】:2013-01-27 02:22:14 【问题描述】:在 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 在存储库目录(我调用 git mergetool 的位置)中生成 BASE、LOCAL 和 REMOTE 文件,Meld 也会尝试打开可执行文件目录中的每个文件。
Meld 没有打开 C:\repo\roses.txt.LOCAL.2760.txt,而是尝试打开 C:\Program Files (x86)\Meld\meld\roses.txt.LOCAL.2760.txt。
以前有没有人遇到过这种情况或知道如何配置 Git / Meld 以在 Windows 中正常工作?
【问题讨论】:
我不知道这是否有任何尝试,但我使用 KDiff3,并且在我的 gitconfig 中设置的路径是:path = C:/Program Files (x86)/KDiff3/kdiff3 .exe 而不是 C:\\ 等。 你能解决这个问题吗? 我做不到。其中一个答案可能是正确的,但我不愿将任何答案标记为这样,因为我实际上无法让 Meld 行为正常:-/ @Nelson 别担心,我也不能 :( 请评论并投票给upstream issue,这样未来的用户甚至不需要担心这个。 【参考方案1】:我遇到了完全相同的问题,发现我必须以蛮力的方式让它工作。 这是我放在 .gitconfig 文件中的内容。 (注意我的 meld 可执行文件在不同的位置)
[merge]
tool = meld
[mergetool "meld"]
cmd = "/c/Meld/meld/meld.exe $PWD/$LOCAL $PWD/$BASE $PWD/$REMOTE --output=$PWD/$MERGED"
【讨论】:
这对我来说确实很好,无论如何我都选择了自定义安装路径。值得注意的是,大多数指南使用的“路径”与此处指定的“cmd”之间存在差异。 我已经尝试了你和 Martin 的解决方案,但都没有奏效。我认为还有其他事情正在发生。一个窗口打开然后立即关闭,然后 Meld 打开,路径指向 Meld 的安装目录而不是 repo。传递给 Meld 的 arg 是否会导致它死亡,然后它会检测到问题并使用默认路径重新启动?我掌握了这里,但我不知道如何解决这个问题...... 您确定您使用的是 meld.exe 而不是(我认为)bin 文件夹中的 meld 文件。我记得有一个问题,我只使用了 meld 文件,它在 git 有机会将文件放入临时文件夹之前启动应用程序。 我使用了您的解决方案,但使用了bin
目录中的meld
文件(我实际上将文件重命名为meld.py
)并且它没有问题。【参考方案2】:
Schuess,注意目录中的空格字符!
[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。我确实发现它似乎在没有路径线的情况下工作。 当我使用cmd
而不使用 path
并使用反引号而不是单引号、单引号而不是斜线双引号时,这对我有用。
使用 Win10 1903 和 WSL,我尝试了一堆这些配置方法,git 无法调用 meld。我最终符号链接Program_Files_x86 -> 'Program Files (x86)/'
并使用[mergetool "meld"] path = /mnt/c/Program_Files_x86/Meld/Meld.exe
【参考方案3】:
我在这个页面上的 meld 安装程序的错误报告中找到了解决方案:
https://code.google.com/p/meld-installer/issues/detail?id=11
据我了解,问题在于 meld.exe 程序(通过 python 解释器运行 meld)不必要地将命令的工作目录设置为 meld.exe 的工作目录。当作为命令行参数传递时,这会导致相对路径被错误地解释。
解决方案是将提供的 meld.exe 替换为使用 AHK2EXe(AutoHotKey 脚本 -> exe)编译 meld.ahk 文件生成的一个。只需下载页面最下方的脚本,因为那里已经发布了几个版本。
【讨论】:
问题跟踪器未设置为自动将问题分配给我,所以我错过了有 cmets。对于后来发现这个的谷歌用户;此问题已修复。【参考方案4】:你为什么不在 Windows 上使用 git bash?
安装后简单地融合:
git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe" <- path to meld here
就是这样!
【讨论】:
这个解决方案对我有用我也做了下面的命令,每次打开工具 git config --global mergetool.prompt false 时都不提示我 此解决方案适用于 Meld 3.16.2,还添加了 git config --global mergetool.keepBackup false 以删除那些讨厌的备份。 由于某种原因,应用此解决方案后,所有内容都显示为红色(已更改),我不得不这样做:git config --global mergetool.meld.cmd '"C:\Program Files (x86)\Meld\Meld.exe" $BASE $LOCAL $REMOTE -o $MERGED'
有了这个解决方案,我得到了Cannot import: GTK+
和DLL load failed
。
@Juergen 答案是路径不匹配。如果你要复制 libgirepository-1.0-1.dll,它位于你的 lib 目录上一个目录(与 Meld.exe 相同的目录)并启动,你会发现一切正常,【参考方案5】:
我也遇到过类似的问题。使用的操作系统是 Windows 10,以下更改对我有用。看起来更像是路径问题
git config --global mergetool.meld.path "/c/Program Files (x86)/Meld/Meld.exe" <- path to meld here
【讨论】:
【参考方案6】:在尝试了以上所有方法后,将 Meld 设置为以管理员身份运行对我来说很有效。
-
右键单击 Meld.exe
转到属性 > 兼容性并选中
Run this program as an administrator
复选框
我收到的错误引用了诸如c:\windows\temp\meld-*
之类的临时文件,这些文件没有被创建。提升 Meld 的权限似乎可以解决问题,因为它现在可以同时使用 git difftool
并在 Meld 中手动运行。
【讨论】:
【参考方案7】:如何使用 meld 作为您的 git difftool
代替 git diff
(另请参阅下面的 meld 屏幕截图):
1。窗户:
下载并安装Git for Windows,其中包括一个类似于“Git Bash”的 Linux 终端,可通过 Windows 资源管理器中任何文件夹中的右键菜单访问,一旦您安装了适用于 Windows 的 Git。
从这里下载并安装 meld:https://meldmerge.org/。
然后,要使 meld
成为您的 git difftool
,您可以在 Git for Windows bash 终端 (as Arugin says) 中使用这两个命令,并使用正确的 Meld.exe 路径:
git config --global merge.tool meld
git config --global mergetool.meld.path "C:\Program Files (x86)\Meld\Meld.exe"
或者您可以直接编辑您的C:\Users\YOUR_USER_NAME\.gitconfig
文件并将以下内容添加到它的末尾(注意这里强制使用双反斜杠 [\\
] 作为路径分隔符!):
[merge]
tool = meld
[mergetool "meld"]
path = C:\\Program Files (x86)\\Meld\\Meld.exe
现在在您的Git for Windows bash 终端中调用git difftool
,Meld 将作为您的默认 difftool 查看器打开!如果您还不知道:您可以通过右键单击 Windows 资源管理器中的文件夹并转到 --> "Git Bash" 或其他任何名称来在 Windows 中打开所述终端。
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
就是这样! git difftool
现在可以在 Linux Ubuntu 上运行!
3。 Mac 操作系统
在 Mac OS 上安装 Meld:https://superuser.com/questions/360007/how-to-install-meld-with-homebrew-on-mac-osx/1177575#1177575。
Meld 截图示例
(source)
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
注意:以下命令假定它们的分支位于您的同一个代码仓库中,因为您是队友。如果不是这种情况,您将不得不稍微修改命令以从他们的分叉存储库而不是从您的公共存储库中签出。当在线查看 PR 时,GitHub 会向您展示他们推荐的用于检查其分支的命令。
-
仅命令
git fetch origin someone_elses_branch
git checkout someone_elses_branch
git difftool main...HEAD # 3 dots, NOT 2!
带有详细 cmets 的命令
# 1. Fetch their remote changes to your local machine into your
# locally-stored,remote-tracking hidden branch named
# `origin/someone_elses_branch`
git fetch origin someone_elses_branch
# 2. Check out this branch locally (this creates the locally-stored branch
# named `someone_elses_branch` from the locally-stored remote-tracking
# hidden branch named `origin/someone_elses_branch`)
git checkout someone_elses_branch
# 3. Do a difftool comparison (using meld now) to see the changes
# made on this branch from the point where they last checked out
# and forked off of `main`. This cmd (using 3 dots) is the equivalent of
# `git difftool $(git merge-base main HEAD) HEAD`.
git difftool main...HEAD # 3 dots, NOT 2!
相关:
-
3 点 vs 2 点:What are the differences between double-dot ".." and triple-dot "..." in Git diff commit ranges?
[我在
git blametool
上的回答] Is there git blame gui similar to bzr qannotate?
从这里下载并安装 meld:https://meldmerge.org/
[我的回答]How do I make Git use the editor of my choice for commits?
[我的仓库]https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
在 Mac OS 上安装 Meld:https://superuser.com/questions/360007/how-to-install-meld-with-homebrew-on-mac-osx/1177575#1177575
【讨论】:
【参考方案8】:没有一个答案对我有用。我最终在 .gitconfig 文件中找到了这个:
[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
并打开融合。保存后,您必须在 git 中提交并解决冲突。
由于某种原因,这只适用于 Meld 3.18.x,Meld 3.20.x 给我一个错误。
【讨论】:
【参考方案9】:由于某种原因,在 Windows 10 中,PATH 环境变量在安装过程中无法正确设置,因此引发了一个奇怪的异常,说它无法找到“C:\Program Files ( x86)/Meld/bin" 目录。
我的一个解决方法是,在 git bash 中执行:
export PATH=$PATH:"/C/Program Files (x86)/Meld/lib"
或者添加到windows PATH
C:\Program Files (x86)/Meld/bin
【讨论】:
以上是关于在 Windows 上使用 Meld 的 Git 合并工具的主要内容,如果未能解决你的问题,请参考以下文章
适用于 Linux 的 Windows 子系统 git mergetool meld UnicodeDecodeError
设置和使用 Meld 作为你的 git difftool 和 mergetool