【发布时间】:2011-11-07 07:07:44
【问题描述】:
我在我的 Subversion 配置中指定了 merge-tool-cmd = meld。当我使用提供的冲突解决选项中的选项 l 解决合并冲突时,我收到消息:
meld: error: too many arguments (wanted 0-4, got 5)
The external merge tool exited with exit code 2
任何人都可以诊断问题/提供解决方案吗?谢谢。
【问题讨论】:
我在我的 Subversion 配置中指定了 merge-tool-cmd = meld。当我使用提供的冲突解决选项中的选项 l 解决合并冲突时,我收到消息:
meld: error: too many arguments (wanted 0-4, got 5)
The external merge tool exited with exit code 2
任何人都可以诊断问题/提供解决方案吗?谢谢。
【问题讨论】:
首先警告!如果您弄错了,很容易最终丢失本地编辑!测试测试测试!
恐怕 pmod 链接中的脚本不适用于 svn 1.6(当前在 Ubuntu 11.04 中)。将来自pmod's link 和here 的代码和建议here 放在一起,我制作了这个似乎可以正常工作的脚本:
#!/usr/bin/env python
# svn merge-tool python wrapper for meld
import sys
import subprocess
try:
# path to meld
meld = "/usr/bin/meld"
# file paths
base = sys.argv[1]
theirs = sys.argv[2]
mine = sys.argv[3]
merged = sys.argv[4]
# the call to meld
# For older meld versions:
# cmd = [meld, mine, base, theirs, merged]
# New meld versions: >= 1.8.4
cmd = [meld, mine, base, theirs, '-o', merged]
# Call meld, making sure it exits correctly
subprocess.check_call(cmd)
except:
print "Oh noes, an error!"
sys.exit(-1)
将其保存在合理的地方(例如/usr/local/bin/svn-merge-meld.py)并使其可执行:
sudo chmod +x /usr/local/bin/svn-merge-meld.py
然后编辑~/.subversion/config 并取消注释merge-tool-cmd = 行,并将路径设置为您的命令。
请注意,当发生冲突时,系统会提示您如何处理。您需要输入一个 l 并让 svn 运行此脚本。完成合并后,您需要输入 r 来解决冲突并将合并后的版本复制到工作副本。
【讨论】:
cmd = [meld, mine, base, theirs, '-o', merged](meld 1.8.4)。 `
drevicko's answer 适用于最近的meld 版本。但也使用较旧的meld 版本:
下面的bash 脚本svn-merge-meld.sh 支持旧的和最近的meld 版本(四个参数中的三个)。
#!/bin/bash
base=${1?1st argument is 'base' file}
theirs=${2?2nd argument is 'theirs' file}
mine=${3?3rd argument is 'mine' file}
merged=${4?4th argument is 'merged' file}
version=$(meld --version | perl -pe '($_)=/([0-9]+([.][0-9]+)+)/' )
if [[ "$version" < 1.7 ]]
then
#old meld version 1.6.* = three input files
cat "$mine" > "$merged"
meld --label="Base=${base##*/}" "$base" \
--label="Mine->Merged=${merged##*/}" "$merged" \
--label="Theirs=${theirs##*/}" "$theirs"
else
# recent meld versions 1.7.* and above = four input files
meld --label="Base=${base##*/}" "$base" \
--label="Mine=${mine##*/}" "$mine" \
--label="Merged=${merged##*/}" "$merged" \
--label="Theirs=${theirs##*/}" "$theirs"
fi
别忘了chmod +x svn-merge-meld.sh。
您也可以download svn-merge-meld.sh 或 fork :
git clone github.com/olibre/svn-useful-scripts.git
最后,更新您的svn 配置:
vi ~/.subversion/config
并启用merge-tool-cmd:
[helpers]
merge-tool-cmd = /home/....../svn-useful-scripts/svn-merge-meld.sh
【讨论】:
您需要使用包装脚本来抓取和放置颠覆工具所需的东西(检查this):
使用外部二路和三路差分工具(其他 当然,与 GNU diff 和 diff3 相比)使用 Subversion 是使用包装脚本,它 将 Subversion 的输入转换为您的 差分工具可以理解,然后将输出转换为 你的工具恢复为 Subversion 期望的格式—— GNU 工具会使用。 ...
Subversion 使用适合的参数调用外部差异程序 GNU diff 实用程序,并且只期望外部程序将 返回成功的错误代码。对于大多数替代差异 程序,只有第六和第七个参数——文件的路径 分别代表差异的左侧和右侧 - 是 感兴趣。
这个描述得很好here
【讨论】: