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

Jof*_*fer 27 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
Run Code Online (Sandbox Code Playgroud)

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

dre*_*cko 42

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

我担心来自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)
Run Code Online (Sandbox Code Playgroud)

将此保存在合理的位置(例如/usr/local/bin/svn-merge-meld.py)并使其可执行:

sudo chmod +x /usr/local/bin/svn-merge-meld.py
Run Code Online (Sandbox Code Playgroud)

然后编辑~/.subversion/config并取消注释该行merge-tool-cmd =,并设置命令的路径.

请注意,发生冲突时,系统将提示您如何处理冲突.您需要键入单个"l"和svn才能运行此脚本.完成合并后,需要键入"r"来解决冲突并将合并后的版本复制到工作副本.

  • 似乎meld的调用cmd已经改变了 - 我使用`cmd = [meld,mine,base,theirs,' - o',merged]`(meld 1.8.4).` (3认同)

oli*_*bre 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
Run Code Online (Sandbox Code Playgroud)

别忘了chmod +x svn-merge-meld.sh.

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

git clone github.com/olibre/svn-useful-scripts.git
Run Code Online (Sandbox Code Playgroud)

最后,更新你的配置:

vi ~/.subversion/config
Run Code Online (Sandbox Code Playgroud)

并启用merge-tool-cmd:

[helpers]
merge-tool-cmd = /home/....../svn-useful-scripts/svn-merge-meld.sh
Run Code Online (Sandbox Code Playgroud)

  • 感谢 @JohnyTex 的错误报告;)十年前,Meld 接受最多 4 个输入文件进行四向合并。但这不再可能了(显然是从 v1.8.4 开始)。:'( 我已经修正了我的答案。(我已经很多年没有使用 SVN 了) (2认同)