2011-08-31 33 views
25

He especificado merge-tool-cmd = meld en mi configuración de Subversion. Cuando voy a resolver un conflicto de combinación con la opción l a partir de las opciones de resolución de conflictos que se presentan, recibo el mensaje:¿Cómo configurar la resolución de conflictos svn con meld?

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

¿Alguien puede diagnosticar el problema/proporcionar una solución? Gracias.

Respuesta

38

Primero una advertencia! ¡Es muy fácil terminar perdiendo tus ediciones locales si te equivocas! Prueba de prueba!

Me temo que el script del enlace de pmod no funciona con svn 1.6 (actual en Ubuntu 11.04). La elaboración de código de pmod's link y here y asesoramiento here, hice este guión que parece funcionar bien:

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

Guardar esto en alguna parte sensible (por ejemplo /usr/local/bin/svn-merge-meld.py) y hacerlo ejecutable:

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

Luego editar ~/.subversion/config y descomente la línea merge-tool-cmd =, y configure la ruta a su comando.

Tenga en cuenta que cuando se produce un conflicto, se le preguntará qué hacer con él. Necesita escribir una sola 'l' y para svn ejecutar este script. Cuando haya terminado su combinación, debe escribir una 'r' para resolver el conflicto y copiar la versión fusionada a la copia de trabajo.

+0

Gracias por la actualización. – Profpatsch

+0

Elimina las importaciones de os y shutil: ya no se usan. – bcelary

+3

Parece que la llamada a cmd para meld ha cambiado - uso 'cmd = [meld, mine, base, theirs, '-o', fusionada]' (meld 1.8.4). ' – Ayrat

2

Es necesario utilizar guión envoltorio para agarrar y poner las cosas subversión es a la orden necesaria para su herramienta de diferencias (marque this):

La clave para el uso externo de dos y tres vías herramientas de diferenciación (Otro que GNU diff y diff3, por supuesto) con Subversion es usar scripts de envoltura, que convierten la entrada de Subversion en algo que su herramienta de diferenciación puede entender, y luego convertir la salida de su herramienta de nuevo a formato que Subversion espera, el formato que usarían las herramientas GNU re. ...

Subversion llama a programas externos de diferencias con los parámetros adecuados para el diff de GNU, y sólo espera que el programa externo vuelta con un código de error exitosa. Para la mayoría de los programas diff alternativos , solo los argumentos sexto y séptimo (las rutas de los archivos que representan los lados izquierdo y derecho del diff, respectivamente) son de interés.

Esto es muy bien descrito here

9

La drevicko's answer es correcta para las versiones recientes meld. Pero también se utilizan más antiguas versiones meld:

La continuación bash guión svn-merge-meld.sh compatible con los antiguos y recientes meld versiones (tres de cuatro argumentos).

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

No olvides chmod +x svn-merge-meld.sh. También download svn-merge-meld.sh o

Puede tenedor que:

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

Por último, actualizar la configuración :

vi ~/.subversion/config 

y permitir merge-tool-cmd:

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

tuve que usar git clone https://github.com/olibre/svn-useful -scripts.git – louisgab

+0

Gracias @louisgab He actualizado la respuesta ;-) – olibre

Cuestiones relacionadas