Mi piacerebbe essere in grado di risolvere i conflitti usando kdiff3, quando SVN mi informa del conflitto. Come posso impostarlo come strumento predefinito per questo?Come impostare kdiff3 come strumento di unione per SVN
risposta
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.
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
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. –
Forse lo hai trovato [qui] (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –
@AdamSpiers, grazie per la fonte. – yvoyer
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:
- svnbook.red-bean.com/en/1.4/svn.advanced.externaldifftools &
- svnbook.red-bean.com/en/1.5/svn.advanced.externaldifftools.
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.
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
Purtroppo non funziona in SVN 1.7.18 – villapx
Cercherò che e vedere, come funziona. – gruszczy
Per lavorare anche con nomi di file contenenti spazi, usare 'kdiff3" $ 1 "" $ 2 "" $ 3 "-o" $ 4 "'. – hlovdal
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