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?

25
demandé sur Peter Mortensen 2011-01-26 14:11:47

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.

29
répondu Jon Ander Ortiz Durántez 2016-11-26 17:50:45

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
4
répondu Adam 2016-11-26 17:51:44

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
3
répondu yvoyer 2011-01-26 22:16:06

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:

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.

3
répondu chetto 2013-12-16 15:37:01