2011-08-31 13 views
25

Ho specificato merge-tool-cmd = meld nella mia configurazione di Subversion. Quando vado a risolvere un conflitto di unione utilizzando l'opzione L fra le opzioni di risoluzione dei conflitti presentati, ricevo il messaggio:Come impostare la risoluzione del conflitto svn con la combinazione?

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

Qualcuno può diagnosticare il problema/fornire una soluzione? Grazie.

risposta

38

Prima un avvertimento! È molto facile finire per perdere le tue modifiche locali se ti sbagli! Test test test!

Ho paura che lo script dal collegamento di pmod non funzioni con svn 1.6 (corrente in Ubuntu 11.04). Mettere insieme il codice da pmod's link e here e consulenza here, ho fatto questo script che sembra funzionare bene:

#!/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) 

Salva questo da qualche parte sensibile (ad es /usr/local/bin/svn-merge-meld.py) e renderlo eseguibile:

sudo chmod +x /usr/local/bin/svn-merge-meld.py 

Poi modificare ~/.subversion/config e decommentare la riga merge-tool-cmd = e impostare il percorso del comando.

Si noti che quando si verifica un conflitto, verrà chiesto cosa fare con esso. È necessario digitare una singola 'l' e per svn per eseguire questo script. Una volta completata l'unione, è necessario digitare una "r" per risolvere il conflitto e copiare la versione unita nella copia di lavoro.

+0

Grazie per l'aggiornamento. – Profpatsch

+0

Rimuovi le importazioni os e shutil: non vengono più utilizzate. – bcelary

+3

Sembra che la chiamata cmd per la combinazione sia cambiata - io uso 'cmd = [combina, mia, base, loro, '-o', unita]' (fusione 1.8.4). ' – Ayrat

2

è necessario utilizzare script wrapper per afferrare e mettere le cose eversione è fuori per l'ordine necessario per il vostro strumento diff (check this):

La chiave per usare a due esterni e tre vie strumenti di differenziazione (altro di GNU diff e diff3, ovviamente) con Subversion è quello di utilizzare gli script wrapper, che convertono l'input da Subversion in qualcosa che lo strumento di differenziazione può comprendere e quindi convertire l'output di lo strumento in un formato previsto da Subversion: il formato che avrebbe utilizzato gli strumenti GNU d. ...

Subversion chiama programmi diff esterni con parametri adatti per l'utilità diff GNU, e si aspetta solo che il programma esterno sarà ritorno con un codice di errore di successo. Per la maggior parte dei programmi alternativi differ , solo il sesto e il settimo argomento - i percorsi dei file che rappresentano rispettivamente i lati destro e sinistro del diff sono di interesse.

Questo è molto ben descritto here

9

Il drevicko's answer è corretto per le versioni recenti di meld. Ma più anziani meld versioni sono utilizzati anche:

Il sotto bash sceneggiatura svn-merge-meld.sh supporta sia le vecchie e le recenti meld versioni (tre di quattro argomenti).

#!/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 

Non dimenticare di chmod +x svn-merge-meld.sh.

È inoltre possibile download svn-merge-meld.sh o la forcella è:

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

Infine, aggiornare la configurazione :

vi ~/.subversion/config 

e consentire merge-tool-cmd:

[helpers] 
merge-tool-cmd = /home/....../svn-useful-scripts/svn-merge-meld.sh 
+1

ha dovuto usare git clone https://github.com/olibre/svn-useful -scripts.git – louisgab

+0

Grazie @louisgab Ho aggiornato la risposta ;-) – olibre

Problemi correlati