2011-08-31 112 views
25

我在Subversion配置中指定了merge-tool-cmd = meld。當我去使用選項L從所呈現的衝突解決方案來解決合併衝突,我收到消息:如何使用meld設置svn衝突解決方案?

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

任何人都可以診斷問題/提供的解決方案?謝謝。

回答

38

首先警告!如果你弄錯了,最終會失去你的本地編輯,這很容易!測試測試測試!

恐怕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並取消註釋行,並設置您的命令的路徑。

請注意,當發生衝突時,系統會提示您如何處理它。你需要輸入一個'l'和svn來運行這個腳本。完成合並後,您需要鍵入'r'來解決衝突並將合併後的版本複製到工作副本。

+0

感謝您的更新。 – Profpatsch

+0

刪除os和shutil進口 - 它們不再使用。 – bcelary

+3

看起來,meld的調用cmd已經改變 - 我使用'cmd = [meld,mine,base,他們,'-o',merged]'(meld 1.8.4)。 ' – Ayrat

2

您需要使用包裝腳本來抓住並把東西顛覆了以需要爲您的比較工具的順序(檢查this):

的關鍵在於使用外部的二維和三路差分工具(其他的 當然比用GNU diff和diff3)是使用包裝腳本,其中 將輸入從Subversion轉換成你的 區分工具可以理解的東西,然後將 的輸出轉換回你的工具Subversion期望的格式 - GNU工具將使用的格式d。 ...

顛覆調用帶有適合 的GNU diff工具參數外置比較程序,預計只有在外部程序將 返回成功的錯誤代碼。對於大多數可選的diff 程序,只有第六個和第七個參數 - 分別代表diff的左側和右側的文件 的路徑是 。

這是很好的描述here

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 
+1

不得不使用git clone https://github.com/olibre/svn-useful -scripts.git – louisgab

+0

謝謝@ louisgab我已經更新了答案;-) – olibre