2011-01-26 20 views

Respuesta

28

Ir al archivo de configuración de Subversion (/etc/subversion/config o ~/.subversion/config), y estableció merge-tool-cmd variable, 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 

A pesar de que hay un problema con kdiff3 que no admite cuatro argumentos lisos (SVN cuatro pases argumentos de civil a kdiff3, y no funciona), por lo que generalmente se llama con un simple script para traducir los argumentos, por ejemplo, "kdiff3caller":

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

Este problema kdiff3 y sol se explica here.

+0

Voy a probar eso y ver cómo funciona. – gruszczy

+1

Para trabajar también con nombres de archivos que contienen espacios, use 'kdiff3" $ 1 "" $ 2 "" $ 3 "-o" $ 4 "'. – hlovdal

+2

Para mí, comienza kdiff3 bien, pero parece que no funciona. Hago una combinación de svn, cuando hay un conflicto que hago "launch (l)" y abre kdiff3 pero luego parece que la fusión no funciona. Se guarda en .svn/tmp pero el comando svn merge simplemente se repite preguntándome nuevamente qué hacer. EDITAR: OK, mi mal. Sí, trabajo, pero primero hay que hacer un (l) lanzamiento, hacer la fusión, y luego seleccionar (r) resolver. – PapaFreud

3

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 copia de seguridad. Una vez intenté algo como sugirió, pero siempre producía algún error con los parámetros hasta que encontré estos scripts que resolvieron todo.

Cree un archivo de comandos y establecer diff-cmd = /path/to/script.sh en su ~/.subversion/config

 
#!/bin/bash 

# Return an errorcode of 0 on successful merge, 1 if unresolved conflicts 
# remain in the result. Any other errorcode will be treated as fatal. 
# Author: Michael Bradley 

#NOTE: all output must be redirected to stderr with "1>&2" as all stdout output is written to the output file 

# Must be called by subversion in "~/.subversion/config" file 
# Add config : "diff-cmd = /path/to/script/myKdiff3.sh" 

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

promptUser() 
{ 
    read answer 
    case "${answer}" in 

     "M"  ) 
     echo "" 1>&2 
     echo "Attempting to merge ${baseFileName} with ${DIFF}" 1>&2 
     $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs -o $output 1>&2 
     bLoop=1 
     if [ -f $output ]; then 
      if [ -s $output ]; then 
       #output succesfully written 
       bLoop=0 
      fi 
     fi 
     if [ $bLoop = 0 ]; then 
      cat $output 
      rm -f $output 
      exit 0 
     else 
      echo "Merge failed, try again" 1>&2 
     fi 

     ;; 

     "m"  ) 
     echo "" 1>&2 
     echo "Attempting to auto-merge ${baseFileName}" 1>&2 
     diff3 -L $labelMine -L $labelOlder -L $labelTheirs -Em $mine $older $theirs > $output 
     if [ $? = 1 ]; then 
      #Can't auto merge 
      rm -f $output 
      $VDIFF3 $older $mine $theirs --L1 $labelOlder --L2 $labelMine --L3 $labelTheirs -o $output --auto 1>&2 
      bLoop=1 
      if [ -f $output ]; then 
       if [ -s $output ]; then 
        #output succesfully written 
        bLoop=0 
       fi 
      fi 
      if [ $bLoop = 0 ]; then 
       cat $output 
       rm -f $output 
       exit 0 
      else 
       echo "Merge failed, try again" 1>&2 
      fi 
     else 
      #We can automerge, and we already did it 
      cat $output 
      rm -f $output 
      exit 0 
     fi 
     ;; 

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

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

     "A" | "a" ) 
     echo "" 1>&2 
     echo "Accepting remote version of file..." 1>&2 
     cat ${theirs} 
     exit 0 
     ;; 

     "I" | "i" ) 
     echo "" 1>&2 
     echo "Keeping local modifications..." 1>&2 
     cat ${mine} 
     exit 0 
     ;; 

     "R" | "r" ) 
     echo "" 1>&2 
     echo "Reverting to base..." 1>&2 
     cat ${older} 
     exit 0 
     ;; 

     "D" | "d" ) 
     echo "" 1>&2 
     echo "Runnig diff3..." 1>&2 
     diff3 -L $labelMine -L $labelOlder -L $labelTheirs -Em $mine $older $theirs 
     #Exit with return vaule of the diff3 (to write out files if necessary) 
     exit $? 
     ;; 

     "S" | "s" ) 
     echo "" 1>&2 
     echo "Saving for later..." 1>&2 
     cat ${mine} 
     #Exit with return vaule of 1 to force writting of files 
     exit 1 
     ;; 

     "Fail" | "fail" | "FAIL" ) 
     echo "" 1>&2 
     echo "Failing..." 1>&2 
     exit 2 
     ;; 

     "H" | "h" ) 
     echo "" 1>&2 
     echo "USAGE OPTIONS:" 1>&2 
     echo " [A]ccept Accept $labelTheirs and throw out local modifications" 1>&2 
     echo " [D]efault Use diff3 to merge files (same behavior as vanilla SVN)" 1>&2 
     echo " [Fail]  Kills the command (not suggested)" 1>&2 
     echo " [H]elp  Print this message" 1>&2 
     echo " [I]gnore Keep your locally modified version as is" 1>&2 
     echo " [M]erge  Manually merge using ${VDIFF3}" 1>&2 
     echo " [m]erge  Same as "M" but attempts to automerge if possible" 1>&2 
     echo " [R]evert Revert to base version (${labelOlder})" 1>&2 
     echo " [S]ave  Same as 'I' but writes out rold, rnew, and rmine files to deal with later" 1>&2 
     echo " [diff]  Type 'diff' to diff versions $labelMine and $labelTheirsthe before making a descision" 1>&2 
     echo " [diff3]  Type 'diff3' to diff all three versions before making a descision" 1>&2 
     echo "" 1>&2 
     ;; 

     * ) 
     echo "'${answer}' is not an option, try again." 1>&2 
     ;; 
    esac 
} 

if [ -z $2 ] 
then 
    echo ERROR: This script expects to be called by subversion 
    exit 1 
fi 

if [ $2 = "-m" ] 
then 
    #Setup vars 
    labelMine=${4} 
    labelOlder=${6} 
    labelTheirs=${8} 
    mine=${9} 
    older=${10} 
    theirs=${11} 
    output=${9}.svnDiff3TempOutput 
    baseFileName=`echo $mine | sed -e "s/.tmp$//"` 

    #Prompt user for direction 
    while [ 1 ] 
    do 
     echo "" 1>&2 
     echo "${baseFileName} requires merging." 1>&2 
     echo "" 1>&2 
     echo "What would you like to do?" 1>&2 
     echo "[M]erge [A]ccept [I]gnore [R]evert [D]efault [H]elp" 1>&2 
     promptUser 
    done 
else 
    L="-L"   #Argument option for left label 
    R="-L"   #Argument option for right label 
    label1=$3  #Left label 
    label2=$5  #Right label 
    file1=$6  #Left file 
    file2=$7  #Right file 

    $DIFF $file1 $file2 $L "$label1" $L "$label2" & 
    #$DIFF $file1 $file2 & 
    #wait for the command to finish 
    wait 
fi 
exit 0 
+0

Ese script no podrá manejar nombres de archivos con espacios sin muchas correcciones a sus presupuestos, cambiando las referencias a '$ older' to be' "$ older" 'y cosas por el estilo. –

+1

Quizás lo encontraste [aquí] (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –

+0

@ AdamSpiers, gracias por la fuente. – yvoyer

3

El guión 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 comandos funciona para versiones SVN anteriores a 1.5. Parece que hubo cambios en --diff-cmd & --diff3-cmd para la versión 1.5. Comparación de secuencias de comandos en las siguientes 2 docs SVN para ver algunas diferencias:

guión de Michael Bradley es realmente útil ya que ahora si consigo un conflicto durante svn update que se inicia en kdiff3 en lugar de vomitar todo el archivo con las marcas de conflicto ">>>>>>>>", que son tan difíciles para 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 utilice --diff3-cmd en el cmdline) desde que escribí mi propio guión para enviar a svn diff sdiff y se especifica por --diff-cmd.

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

4

Una solución que es más corto y funciona con las versiones posteriores de SVN SVN (probado en 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: [email protected]" > $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 [email protected]; 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 

ligarlo a svn en ~ /.subversion/config

diff3-cmd = ~/svn-merge-kdiff 
+0

No funciona en SVN 1.7.18, desafortunadamente – villapx

Cuestiones relacionadas