Comment définir kdiff3 comme outil de fusion pour SVN
j'aimerais pouvoir résoudre les conflits en utilisant kdiff3, lorsque SVN m'informe du conflit. Comment puis-je le Définir comme un outil par défaut pour cela?
4 réponses
allez dans le fichier de configuration de Subversion (/etc/subversion/config
ou ~/.subversion/config
), et set merge-tool-cmd
variable avec votre outil préféré:
### 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
bien qu'il y ait un problème avec kdiff3 qui ne supporte pas quatre arguments simples (SVN passe quatre arguments simples à kdiff3, et cela ne fonctionne pas), il est donc généralement appelé avec un script simple pour traduire les arguments, par exemple, "kdiff3caller":
#!/bin/sh
kdiff3 "" "" "" -o ""
ce problème kdiff3 et sa solution sont expliqués ici.
une solution plus courte et qui fonctionne avec les versions ultérieures de SVN (testé sur SVN 1.7.7):
Créer un script ~ / svn-merge-kdiff
#!/bin/bash
# Useful when something fails
LOG=~/svn-merge-kdiff-last-run.log
echo "arguments passed to : $@" > $LOG
# Now, don't think you will get the , , 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
Lier à svn ~/.subversion / config
diff3-cmd = ~/svn-merge-kdiff
j'ai trouvé ce script quelque part dont je ne me souviens pas. mais L'auteur est Michael Bradley.
ma réponse est similaire à celle de Jon Ander Ortiz Durántez. Donc si sa réponse ne fonctionne pas, vous avez une sauvegarde. J'ai essayé une fois quelque chose comme il l'a suggéré, mais il a toujours produit une erreur avec les paramètres jusqu'à ce que je trouve ce script qui a résolu tout.
Créer un fichier de script et set diff-cmd = /path/to/script.sh
dans votre ~/.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 ] then echo ERROR: This script expects to be called by subversion exit 1 fi if [ = "-m" ] then #Setup vars labelMine= labelOlder= labelTheirs= mine= older= theirs= output=.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= #Left label label2= #Right label file1= #Left file file2= #Right file $DIFF $file1 $file2 $L "$label1" $L "$label2" & #$DIFF $file1 $file2 & #wait for the command to finish wait fi exit 0
le script de la réponse d'yvoyer fonctionne très bien pour moi, et J'utilise SVN 1.4. Je pense que la réponse précédente de Jon Ander Ortiz Durántez fonctionne pour SVN 1.5 et plus, et ce script fonctionne pour les versions SVN antérieures à 1.5. Il semble qu'il y ait eu des changements à --diff-cmd & --diff3-cmd pour la version 1.5. Comparer les scripts dans les 2 SVN docs à voir quelques différences:
- svnbook.red-bean.com/en/1.4/svn.advanced.externaldifftools &
- svnbook.red-bean.com/en/1.5/svn.advanced.externaldifftools.
le script de Michael Bradley est vraiment utile depuis maintenant si je reçois un conflit pendant svn update
il s'enclenche dans kdiff3 au lieu de vomir partout dans le fichier avec le ">>>>>>>>" les marqueurs de conflit qui sont si difficiles à résoudre si vous avez des conficts complexes. Le diff3-cmd fonctionne à la fois pour la fusion et la mise à jour.
j'ai ajouter diff3-cmd = /usr/local/bin/svndiff3
~/.subversion/config
(ou l'utilisation --diff3-cmd
sur le cmdline) puisque j'ai écrit mon propre script pour envoyer svn diff
à sdiff et est spécifié par --diff-cmd
.
ce script est posté à yolinux, et une version légèrement modifiée (qui gère la fusion automatique) est postée ici Jawspeak.