29

我已经merge-tool-cmd = meld在我的 Subversion 配置中指定了。当我使用提供的冲突解决选项中的选项 l 解决合并冲突时,我收到以下消息:

meld: error: too many arguments (wanted 0-4, got 5)
The external merge tool exited with exit code 2

任何人都可以诊断问题/提供解决方案吗?谢谢。

4

3 回答 3

45

首先警告!如果您弄错了,很容易最终丢失本地编辑!测试测试测试!

恐怕 pmod 链接中的脚本不适用于 svn 1.6(当前在 Ubuntu 11.04 中)。将pmod 的链接此处的代码以及此处的建议放在一起我制作了这个似乎可以正常工作的脚本:

#!/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 =,并将路径设置为您的命令。

请注意,当发生冲突时,系统会提示您如何处理它。你需要输入一个lsvn 来运行这个脚本。完成合并后,您需要键入 anr来解决冲突并将合并的版本复制到工作副本。

于 2011-09-14T14:32:54.340 回答
9

drevicko的答案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

您也可以下载svn-merge-meld.sh或分叉它:

git clone github.com/olibre/svn-useful-scripts.git

最后,更新你的配置:

vi ~/.subversion/config

并启用merge-tool-cmd

[helpers]
merge-tool-cmd = /home/....../svn-useful-scripts/svn-merge-meld.sh
于 2013-10-26T10:28:52.063 回答
2

您需要使用包装脚本来抓取和放置颠覆工具所需的东西(检查):

在 Subversion 中使用外部二路和三路差分工具(当然除了 GNU diff 和 diff3)的关键是使用包装脚本,它将来自 Subversion 的输入转换为您的差分工具可以理解的内容,然后将工具的输出转换回 Subversion 期望的格式——GNU 工具会使用的格式。...

Subversion 使用适合 GNU diff 实用程序的参数调用外部 diff 程序,并且只期望外部程序将返回一个成功的错误代码。对于大多数替代 diff 程序,只有第六个和第七个参数——分别代表 diff 左侧和右侧的文件的路径——是有意义的。

这在这里描述得很好

于 2011-08-31T07:39:47.537 回答