如何使用Meld设置SVN冲突解决?

29

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

有人能够诊断问题/提供解决方案吗?谢谢。

4个回答

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 =这一行,并将路径设置为您的命令。

注意,当发生冲突时,会提示您如何处理。您需要输入一个单独的l,让svn运行此脚本。完成合并后,您需要输入r来解决冲突并将合并版本复制到工作副本中。


移除 os 和 shutil 的导入 -- 它们不再被使用了。 - bcelary
3
看起来 meld 的调用命令已经改变了——我使用的是 cmd = [meld, mine, base, theirs, '-o', merged](meld 1.8.4)。 - Ayrat
在 catch 中丢弃错误信息并不是很有用。 - demented hedgehog
很棒的答案。我之前已经投过票了,现在第二次回来(需要解决svn冲突的问题再次出现..)想再次投票 :) - artm

11

drevicko的回答是正确的,但需要使用Python。这个回答提供了一个脚本的替代方案:

#!/bin/bash

base=${1?1st arg is the 'base' file}
theirs=${2?2nd arg is 'theirs' file}
mine=${3?3rd arg is 'mine' file}
merged=${4?4th arg is the 'merged' file}

cat "$mine" > "$merged"

meld -L "Base=${base##*/}"           "$base"   \
     -L "Mine->Merged=${merged##*/}" "$merged" \
     -L "Theirs=${theirs##*/}"       "$theirs" \
     -o "$merged"

将上述脚本复制到文件svn-merge-meld.sh中,并使用以下命令添加执行权限:

chmod +x svn-merge-meld.sh

最后编辑您的配置:

vi ~/.subversion/config

并启用 merge-tool-cmd

[helpers]
merge-tool-cmd = /path/to/svn-merge-meld.sh

1
meld 3.18.0 只接受 3 个参数。如何支持? - JohnyTex
2
感谢@JohnyTex的错误报告 ;) 十年前,Meld可以接受最多4个输入文件进行四向合并。但现在不再可能了(自v1.8.4以来显然如此)。 :'( 我已经修复了我的答案。(我已经很多年没有使用SVN了) - oHo

2
您需要使用包装脚本来抓取和放置东西,以便将Subversion输出的内容按照您的diff工具所需的顺序排列(请参阅此链接:http://svnbook.red-bean.com/en/1.5/svn.advanced.externaldifftools.html):
使用外部两方和三方差异工具(当然不包括GNU diff和diff3)与Subversion配合使用的关键是使用包装脚本,将Subversion输入转换为您的差异工具可以理解的格式,然后再将您的工具输出转换为Subversion期望的格式- GNU工具将使用的格式。
Subversion使用适用于GNU diff实用程序的参数调用外部差异程序,并且仅期望外部程序返回成功的错误代码。对于大多数替代差异程序,只有第六个和第七个参数-分别表示差异左侧和右侧的文件路径-才是感兴趣的。这在此处有非常好的描述。

0
我更新了@drevicko的答案,使其适用于subversion>=1.14,meld>=3.20和Python 3。
#!/usr/local/bin/python3

# 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]
   merged1 = sys.argv[4]
   merged2 = sys.argv[5]

   print(14*"*" + " MELD was called with " + 14*"*")
   print(f"base    = {base}")
   print(f"theirs  = {theirs}")
   print(f"mine    = {mine}")
   print(f"merged1 = {merged1}")
   print(f"merged2 = {merged2}")

   # the call to meld
   cmd = [meld, mine, base, theirs, '-o', merged1, '--auto-merge', '-L', 'mine -> base(merged) <-theirs']

   # Call meld, making sure it exits correctly
   subprocess.check_call(cmd)
except Exception:
   print("There was an error calling meld!")
   sys.exit(-1)

print(50*"*")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接