Cómo configurar kdiff3 como herramienta de combinación para SVN

Me gustaría poder resolver conflictos usando kdiff3, cuando SVN me notifica sobre el conflicto. ¿Cómo puedo configurarlo como una herramienta pnetworkingeterminada para esto?

Vaya al file de configuration de Subversion ( /etc/subversion/config o ~/.subversion/config ), y configure la variable merge-tool-cmd con su herramienta favorita:

 ### Set merge-tool-cmd to the command used to invoke your external ### merging tool of choice. Subversion will pass 4 arguments to ### the specified command: base theirs mine merged # merge-tool-cmd = merge_command 

Aunque hay un problema con kdiff3 que no admite cuatro arguments simples (SVN pasa cuatro arguments simples a kdiff3, y no funciona), por lo general se llama con un script simple para traducir los arguments, por ejemplo, "kdiff3caller":

 #!/bin/sh kdiff3 "$1" "$2" "$3" -o "$4" 

Este problema y solución kdiff3 se explica aquí .

Una solución que es más corta y funciona con versiones posteriores de SVN (probado en SVN 1.7.7):

Crear un script ~ / svn-merge-kdiff

 #!/bin/bash # Useful when something fails LOG=~/svn-merge-kdiff-last-run.log echo "arguments passed to $0: $@" > $LOG # Now, don't think you will get the $1, $2, etc... by referencing. # At first, you have to copy it to an array for i in $@; do args=( ${args[@]} $i ) done echo "parsed args" >> $LOG for i in ${args[@]}; do echo $i >> $LOG done # I keep it in case something changes if [ "${args[1]}" == "-m" ] && [ "${args[2]}" == "-L" ] && [ "${args[3]}" == ".mine" ];then command="kdiff3 --L1 ${args[5]} --base ${args[9]} --L2 ${args[7]} ${args[10]} --L3 ${args[3]} ${args[8]} -o merged" $command if [[ $? -ne 0 ]]; then echo "$command failed" >> $LOG exit 1 fi # You have to do this, otherwise after the merge you will see... empty file(?) cat merged rm merged exit 0 fi exit -1 

Enlazarlo a svn en ~ / .subversion / config

 diff3-cmd = ~/svn-merge-kdiff 

Encontré este script en algún lugar que no recuerdo. pero el autor es Michael Bradley.

Mi respuesta es similar a las respuestas de Jon Ander Ortiz Durántez. Entonces, si su respuesta no funciona, tienes una copy de security. Una vez intenté algo como sugirió, pero siempre producía algún error con los parameters hasta que encontré estos scripts que resolvieron todo.

Cree un file de script y establezca diff-cmd = /path/to/script.sh en su ~/.subversion/config

 #! / bin / bash

 # Devuelve un código de error de 0 en la fusión exitosa, 1 si hay conflictos no resueltos
 # permanecer en el resultado.  Cualquier otro código de error será tratado como fatal.
 # Autor: Michael Bradley

 #NOTA: todos los resultados se deben networkingireccionar a stderr con "1> & 2" ya que todos los resultados de stdout se escriben en el file de salida

 # Debe ser llamado por subversion en el file "~ / .subversion / config"
 # Agregar configuration: "diff-cmd = /path/to/script/myKdiff3.sh" 

 VDIFF3 = "kdiff3"
 DIFF3 = "diff3" 
 DIFF = "kdiff3"  

 preguntar al usuario ()
 {
     leer respuesta
     caso "$ {respuesta}" en

         "M") 
         echo "" 1> y 2
         echo "Intenta fusionar $ {baseFileName} con $ {DIFF}" 1> & 2
         $ VDIFF3 $ older $ mine $ theirs --L1 $ labelOlder --L2 $ labelMine --L3 $ labelTheirs -o $ output 1> & 2
         bLoop = 1
         if [-f $ salida];  entonces
             if [-s $ salida];  entonces
                 #output escrito con éxito
                 bLoop = 0
             fi
         fi
         if [$ bLoop = 0];  entonces
             gato $ salida
             rm -f $ salida
             salida 0
         más
             echo "Merge failed, try again" 1> & 2
         fi

         ;;

         "m") 
         echo "" 1> y 2
         echo "Intentando fusionar automáticamente $ {baseFileName}" 1> & 2
         diff3 -L $ labelMine -L $ labelOlder -L $ labelTheirs -Em $ mine $ older $ theirs> $ output
         si [$?  = 1];  entonces
             # No se puede combinar automáticamente
             rm -f $ salida
             $ VDIFF3 $ más viejo $ mine $ theirs --L1 $ labelOlder --L2 $ labelMine --L3 $ labelTheirs -o $ output --auto 1> & 2
             bLoop = 1
             if [-f $ salida];  entonces
                 if [-s $ salida];  entonces
                     #output escrito con éxito
                     bLoop = 0
                 fi
             fi
             if [$ bLoop = 0];  entonces
                 gato $ salida
                 rm -f $ salida
                 salida 0
             más
                 echo "Merge failed, try again" 1> & 2
             fi
         más
             # Podemos automatizar, y ya lo hicimos
             gato $ salida
             rm -f $ salida
             salida 0
         fi
         ;;

         "diff3" |  "Diff3" |  "DIFF3")
         echo "" 1> y 2
         echo "Diffing ..." 1> y 2
         $ VDIFF3 $ older $ mine $ theirs --L1 $ labelOlder --L2 $ labelMine --L3 $ labelTheirs 1> & 2
         ;;

         "diff" |  "Diff" |  "DIFF")
         echo "" 1> y 2
         echo "Diffing ..." 1> y 2
         $ DIFF $ mine $ theirs -L $ labelMine -L $ labelTheirs 1> & 2
         ;;

         "A" |  "un" ) 
         echo "" 1> y 2
         echo "Aceptar versión remota de file ..." 1> & 2
         gato $ {theirs}
         salida 0
         ;;

         "Yo" |  "yo" ) 
         echo "" 1> y 2
         echo "Guardando modificaciones locales ..." 1> y 2
         gato $ {mío}
         salida 0
         ;;

         "R" |  "r") 
         echo "" 1> y 2
         echo "Revertir a base ..." 1> & 2
         gato $ {older}
         salida 0
         ;;

         "D" |  "d") 
         echo "" 1> y 2
         echo "Runnig diff3 ..." 1> y 2
         diff3 -L $ labelMine -L $ labelOlder -L $ labelTheirs -Em $ mine $ older $ theirs
         #Salir con el valor de retorno del diff3 (para escribir files si es necesario)
         salir $?
         ;;

         "S" |  "s") 
         echo "" 1> y 2
         echo "Guardando para más adelante ..." 1> y 2
         gato $ {mío}
         #Salir con el valor de retorno de 1 para forzar la escritura de files
         salida 1
         ;;

         "Fail" |  "falla" |  "FALLAR" ) 
         echo "" 1> y 2
         echo "Fallándolo ..." 1> y 2 
         salida 2
         ;;

         "H" |  "h") 
         echo "" 1> y 2
         echo "OPCIONES DE USO:" 1> & 2 
         echo "[A] ccept aceptar $ labelTheirs y tirar modificaciones locales" 1> & 2
         echo "[D] efault Use diff3 para fusionar files (mismo comportamiento que el SVN de vanilla)" 1> & 2
         echo "[Fail] Mata el command (no recomendado)" 1> & 2
         echo "[H] elp Imprime este post" 1> & 2
         echo "[I] gnore Mantenga su versión modificada localmente como es" 1> & 2
         echo "[M] erge Combinación manual usando $ {VDIFF3}" 1> & 2
         echo "[m] erge Igual que" M "pero intenta automatizar si es posible" 1> & 2
         echo "[R] evert Revertir a la versión base ($ {labelOlder})" 1> & 2
         echo "[S] ave Igual que 'I' pero escribe files rold, rnew y rmine para tratar luego" 1> & 2
         echo "[diff] Escriba 'diff' a las versiones diff $ labelMine y $ labelTheirsthe antes de hacer una descision" 1> & 2
         echo "[diff3] Escriba 'diff3' para diferenciar las tres versiones antes de hacer una descision" 1> & 2
         echo "" 1> y 2
         ;;

         *) 
         echo "'$ {answer}' no es una opción, intenta de nuevo."  1> y 2
         ;;
     esac 
 }

 si [-z $ 2]
 entonces
     echo ERROR: este script espera ser llamado por subversion
     salida 1
 fi

 si [$ 2 = "-m"]
 entonces
     #Setup vars
     labelMine = $ {4}
     labelOlder = $ {6}
     labelTheirs = $ {8}
     mina = $ {9}
     mayor = $ {10}
     theirs = $ {11}
     salida = $ {9} .svnDiff3TempOutput
     baseFileName = `echo $ mine |  sed -e "s / .tmp $ //" `

     #Prompt usuario para la dirección
     mientras [1]
     hacer
         echo "" 1> y 2
         echo "$ {baseFileName} requiere fusión."  1> y 2 
         echo "" 1> y 2
         echo "¿Qué te gustaría hacer?"  1> y 2
         echo "[M] erge [A] ccept [I] gnore [R] evert [D] efault [H] elp" 1> & 2 
         preguntar al usuario
     hecho
 más
     L = "- L" # Opción de argumento para la label izquierda
     R = "- L" # Opción de argumento para la label correcta
     label1 = $ 3 #Left label
     label2 = $ 5 # Etiqueta correcta
     file1 = $ 6 file #Left
     file2 = $ 7 #Right file

     $ DIFF $ file1 $ file2 $ L "$ label1" $ L "$ label2" &
     # $ DIFF $ file1 $ file2 &
     #espera que el command termine
     Espere
 fi
 salida 0

El script de la respuesta de yvoyer funciona muy bien para mí, y estoy usando SVN 1.4. Creo que la respuesta anterior de Jon Ander Ortiz Durántez funciona para SVN 1.5 y posteriores, y esta secuencia de commands funciona para versiones SVN anteriores a 1.5. Parece que hubo cambios en –diff-cmd y –diff3-cmd para la versión 1.5. Compare las secuencias de commands en los siguientes 2 documentos SVN para ver algunas diferencias:

  • svnbook.networking-bean.com/en/ 1.4 /svn.advanced.externaldifftools &
  • svnbook.networking-bean.com/en/ 1.5 /svn.advanced.externaldifftools .

El guión de Michael Bradley es realmente útil ya que ahora si tengo un conflicto durante la svn update , entra en kdiff3 en lugar de aparecer en todo el file con los ">>>>>>>>" marcadores de conflicto que son tan difíciles de resolver si tienes confictos complejos. El diff3-cmd funciona tanto para fusión como para actualización.

Agrego diff3-cmd = /usr/local/bin/svndiff3 a ~/.subversion/config (o uso --diff3-cmd en la línea de cm) ya que escribí mi propia secuencia de commands para enviar svn diff a sdiff y está especificado por --diff-cmd .

Este script está publicado en yolinux , y una versión ligeramente modificada (que maneja la fusión automática) se publica aquí Jawspeak .