如何使用融合设置svn冲突解决方案?

时间:2011-08-31 02:42:42

标签: svn meld

我在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

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

3 个答案:

答案 0 :(得分:42)

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

我担心来自pmod链接的脚本不适用于svn 1.6(Ubuntu 11.04中的当前版本)。汇总来自pmod's linkhere以及建议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”来解决冲突并将合并后的版本复制到工作副本。

答案 1 :(得分:9)

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或分叉:

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

答案 2 :(得分:2)

您需要使用包装器脚本来抓取并将subversion设置为diff工具所需的顺序(检查this):

  

使用外部双向和三向差分工具的关键(其他   比起GNU diff和diff3,当然)使用Subversion就是使用包装器脚本   将来自Subversion的输入转换为您的输入   差异工具可以理解,然后转换输出   你的工具回到Subversion期望的格式 - 格式   GNU工具会使用。   ...

     

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

这是非常好的描述here