2011-01-26 17 views
25

SVN, çakışmayı bana bildirdiğinde kdiff3 kullanarak çakışmaları çözebilirim. Bunu bunun için varsayılan bir araç olarak nasıl ayarlayabilirim?kdiff3, SVN için birleştirme aracı olarak nasıl ayarlanı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 

dört düz argümanları desteklemeyen KDiff3 ile ilgili bir sorun olmamasına rağmen (SVN dört geçirir:

cevap

28

Subversion yapılandırma dosyasında (/etc/subversion/config veya ~/.subversion/config) gidin ve favori aracı ile merge-tool-cmd değişkeni ayarlamak düz argümanlar KDiff3 için ve bu çalışmıyor), yüzden genellikle örneğin "kdiff3caller", argümanları çevirmek için basit bir komut dosyası ile denir:

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

Bu KDiff3 sorun ve sol rasyon here açıklanmaktadır.

+0

Bunu deneyeceğim ve nasıl çalıştığını göreceğim. – gruszczy

+1

Ayrıca boşluk içeren dosya adları ile çalışmak için, 'kdiff3 '$ 1" "$ 2" "$ 3" -o "$ 4" 'kullanın. – hlovdal

+2

Benim için kdiff3 tamam, ama işe yaramaz görünüyor. Ben bir çatışması var, bir çatışma olduğunda "(l) başlatmak" ve kdiff3 açar ama sonra birleştirme işe yaramaz. .svn/tmp'ye kaydeder ama svn birleştirme komutu sadece tekrar ne yapacağımı tekrar soruyor. DÜZENLEME: Tamam, kötüyüm. Çalışıyorum ama önce bir (l) lansman yapmalı, birleştirmeli ve sonra (r) çözümlenecek. – PapaFreud

3

Bu senaryoyu hatırlayamadığım bir yerde buldum. ama yazar Michael Bradley.

Cevabım, Jon Ander Ortiz Durántez'in cevaplarına benziyor. Eğer cevabı işe yaramazsa, bir yedeğiniz olur. Bir keresinde önerdiği gibi bir şey denedim, ama her şeyi çözen bu betikleri bulana kadar her zaman parametrelerle bazı hatalar verdi.

bir komut dosyası oluşturun ve yvoyer cevabı adresinin ~/.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

Bu betik dosya isimlerini alıntı yapmak için çok fazla düzeltmeye gerek duymadan boşluklarla birlikte kullanamayacaktır. "$ büyük" ve benzerleri. –

+1

Belki de onu burada bulabilirsiniz (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –

+0

@AdamSpiers, kaynak için teşekkürler. – yvoyer

3

komut diff-cmd = /path/to/script.sh set benim için büyük çalışır ve SVN 1.4 kullanıyorum. Bence Jon Ander Ortiz Durántez'in önceki cevabı SVN 1.5 ve üstü için çalışıyor ve bu betik SVN sürümleri 1.5'ten önce çalışıyor. Görünüşe göre sürüm 1.5 için --diff-cmd & --diff3-cmd. bazı farklılıklar görmek için aşağıdaki 2 SVN docs komut dosyaları karşılaştırın:

Ben svn update sırasında bir çakışma alırsanız şimdi hepsi çok zordur ">>>>>>>>" çatışma belirteçleri ile dosyanın üzerine barfing yerine KDiff3 içine tekmeler beri Michael Bradley'in senaryo gerçekten yararlı karmaşık karışıklıklarınız varsa çözmek için. Diff3-cmd hem birleştirme hem de güncelleme için çalışır.

Ben diff3-cmd = /usr/local/bin/svndiff3~/.subversion/config eklemek (veya cmdline üzerinde --diff3-cmd kullanın) Ben sdiff için svn diff göndermek için kendi senaryoyu yazdım ve --diff-cmd tarafından belirtilen beri.

Bu komut dosyası yolinux adresinde ve biraz değiştirilmiş (burada otomatik birleştirme işlemlerini gerçekleştiren) sürümde yayınlanmıştır Jawspeak.

4

kısadır ve (SVN 1.7.7 üzerinde test) SVN sonraki sürümlerinde ile çalışan bir çözüm:

~/svn-birleştirme-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 

bunun Bind Senaryo oluşturun ~ 'da özetlenebilir.subversion/config

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

Maalesef SVN 1.7.18'de çalışmıyor – villapx

İlgili konular