2011-01-26 6 views

risposta

28

Vai al file di configurazione di Subversion (/etc/subversion/config o ~/.subversion/config), e impostare merge-tool-cmd variabile con il vostro strumento preferito:

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

Anche se c'è un problema con KDiff3 che non supporta quattro argomenti semplici (SVN passa a quattro argomenti semplici per KDiff3, e non funziona), quindi viene chiamato di solito con un semplice script di tradurre gli argomenti, ad esempio, "kdiff3caller":

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

Questo problema kdiff3 e Sol ution è spiegato here.

+0

Cercherò che e vedere, come funziona. – gruszczy

+1

Per lavorare anche con nomi di file contenenti spazi, usare 'kdiff3" $ 1 "" $ 2 "" $ 3 "-o" $ 4 "'. – hlovdal

+2

Per me inizia kdiff3 ok, ma non sembra funzionare. Faccio un svn unire, quando c'è un conflitto faccio "launch (l)" e apre kdiff3 ma poi l'unione non sembra funzionare. Salva in .svn/tmp ma il comando svn merge si ripete da solo chiedendomi di nuovo cosa fare. EDIT: OK, mio ​​male. Funziono, ma è necessario eseguire prima un (1) avvio, eseguire l'unione e quindi selezionare (r) risolto. – PapaFreud

3

Ho trovato questo script da qualche parte che non ricordo. ma l'autore è Michael Bradley.

La mia risposta è simile alle risposte di Jon Ander Ortiz Durántez. Quindi se la sua risposta non funziona, hai un backup. Una volta ho provato qualcosa come mi ha suggerito, ma ha sempre generato un errore con i parametri fino a quando ho trovato questo script che risolveva tutto.

creare un file script e impostare diff-cmd = /path/to/script.sh nella vostra ~/.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

Questo script non sarà in grado di gestire nomi di file con spazi senza molte correzioni al suo quoting - cambiando i riferimenti a '$ older' per essere' "$ older" e simili. –

+1

Forse lo hai trovato [qui] (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –

+0

@AdamSpiers, grazie per la fonte. – yvoyer

3

Lo script di risposta di yvoyer grandi opere per me, e sto usando SVN 1.4. Penso che la precedente risposta di Jon Ander Ortiz Durántez funzioni per SVN 1.5 e versioni successive, e questo script funzioni per le versioni SVN precedenti alla 1.5. Sembra che ci siano state modifiche a --diff-cmd & --diff3-cmd per la versione 1.5. Confrontare gli script nei seguenti 2 documenti SVN per vedere alcune differenze:

sceneggiatura di Michael Bradley è molto utile dato che ora se ho un conflitto durante svn update calci in kdiff3 invece di vomitare tutto il file con i ">>>>>>>>" marcatori di conflitto, che sono così difficili risolvere se si hanno confessioni complesse. Il diff3-cmd funziona sia per l'unione che per l'aggiornamento.

aggiungo diff3-cmd = /usr/local/bin/svndiff3-~/.subversion/config (o usare --diff3-cmd sul cmdline) da quando ho scritto il mio script per inviare svn diff a sdiff e viene specificato dal --diff-cmd.

Questo script è pubblicato su yolinux e una versione leggermente modificata (che gestisce l'unione automatica) è pubblicata qui Jawspeak.

4

Una soluzione che è più breve e funziona con le versioni successive di SVN (testato su SVN 1.7.7):

Creare uno 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 

Bind it per svn in ~ /.subversion/config

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

Purtroppo non funziona in SVN 1.7.18 – villapx