tortoise - ¿Cómo configurar la resolución de conflictos svn con meld?
tortoise svn server (3)
He especificado merge-tool-cmd = meld en mi configuración de Subversion. Cuando voy a resolver un conflicto de combinación utilizando la opción l de las opciones de resolución de conflictos presentadas, recibo el mensaje:
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.
Debe usar el script de envoltura para tomar y poner cosas que la subversión está fuera de la orden necesaria para su herramienta de diff (verifique this ):
La clave para usar herramientas de diferenciación externas de dos y tres vías (distintas de GNU diff y diff3, por supuesto) con Subversion es usar scripts de envoltura, que convierten la entrada de Subversion en algo que tu herramienta de diferenciación pueda entender, y luego Convierta la salida de su herramienta a un formato que Subversion espera, el formato que habrían usado las herramientas de GNU. ...
Subversion llama a los programas de diferencias externas con parámetros adecuados para la utilidad de diff de GNU, y solo espera que el programa externo regrese con un código de error exitoso. Para la mayoría de los programas de diferencias alternativas, solo los argumentos sexto y séptimo -las rutas de los archivos que representan los lados izquierdo y derecho de la diferencia, respectivamente- son de interés.
Esto está muy bien descrito aquí
La respuesta de drevicko es correcta para las versiones recientes de meld
. Pero también se usan versiones meld
más antiguas:
- viejo Meld-1.6.1 en Ubuntu 13.04 (Raring) y Debian Wheezy (7.0)
- nuevo Meld-1.8.2 en Ubuntu 13.10 (Saucy) y Debian Jessie
La siguiente secuencia de comandos bash
svn-merge-meld.sh
compatible tanto con versiones antiguas como recientes (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 te olvides de chmod +x svn-merge-meld.sh
.
También puede descargar svn-merge-meld.sh
o bifurcarlo:
git clone github.com/olibre/svn-useful-scripts.git
Finalmente, actualice su configuración de svn :
vi ~/.subversion/config
y habilitar merge-tool-cmd
:
[helpers]
merge-tool-cmd = /home/....../svn-useful-scripts/svn-merge-meld.sh
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). Poniendo el código del enlace de pmod y here y el consejo here , hice este script 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)
Guarde esto en algún lugar sensato (por ejemplo, /usr/local/bin/svn-merge-meld.py
) y /usr/local/bin/svn-merge-meld.py
ejecutable:
sudo chmod +x /usr/local/bin/svn-merge-meld.py
Luego edite ~/.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.