2011-01-26 12 views
25

SVNが私にその矛盾を通知すると、kdiff3を使って矛盾を解決したいと考えています。これをデフォルトのツールとして設定するにはどうすればよいですか? Subversionの設定ファイル(/etc/subversion/configまたは~/.subversion/config)へSVN用のマージツールとしてkdiff3を設定する方法

答えて

28

移動し、お好みのツールでmerge-tool-cmd変数を設定します。

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

4つのプレーンの引数をサポートしていませんKDiff3のに問題がありますが(SVNは4を渡します無地)KDiff3のために、それが動作しない引数、通常、引数を変換するために簡単なスクリプトと呼ばれ、例えば、「kdiff3caller」:

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

このKDiff3の問題やゾル訳はhereです。

+0

私はそれを試してみて、どのように動作するかを見てみましょう。 – gruszczy

+1

スペースを含むファイル名でも動作させるには、 'kdiff3" $ 1 "" $ 2 "" $ 3 "-o" $ 4 "'を使用します。 – hlovdal

+2

私にとってはkdiff3 okですが、うまくいかないようです。私はsvnのマージを行います。競合が起きると "launch(l)"してkdiff3を開きますが、マージは機能していないようです。それは.svn/tmpに保存されますが、svn mergeコマンドは何をすべきかを私に再度尋ねるだけです。 編集:OK、悪いです。私は動作しますが、最初に(l)起動し、マージしてから、(r)を選択する必要があります。 – PapaFreud

3

このスクリプトはどこか覚えられませんでした。著者はMichael Bradleyです。

私の答えはJon Ander OrtizDurántezの答えに似ています。だから彼の答えがうまくいかなければ、あなたはバックアップを持っています。私はかつて彼が提案したようなものを試しましたが、すべてを解決したこのスクリプトが見つかるまで、パラメータで何らかのエラーを出力します。

は、スクリプトファイルを作成し、~/.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

そのスクリプトは、クォートに多くの修正を加えずにスペースを含むファイル名を扱うことはできません。 '$ older'への参照を' "$ older"などがあります。 –

+1

多分あなたは[ここ](https://negativesum.net/tech/log/using-kdiff3-with-svn/)を見つけましたか? –

+0

@AdamSpiers、ソースのおかげで。 – yvoyer

3

diff-cmd = /path/to/script.shを設定yvoyerの答えからスクリプトは私にとって素晴らしい作品、と私はSVN 1.4を使用しています。私はJon Ander OrtizDurántezの以前の答えはSVN 1.5以上で動作し、このスクリプトは1.5より前のSVNバージョンで動作すると思います。バージョン1.5では--diff-cmd & --diff3-cmdが変更されたようです。

私はsvn updateの間に紛争を得れば、今それがすべてのように困難な「>>>>>>>>」衝突マーカを使用してファイル上barfingの代わりにKDiff3のに蹴る以来、マイケル・ブラッドリーのスクリプトは本当に便利ですあなたが複雑な告発を持っているなら解決してください。 diff3-cmdは、マージと更新の両方に機能します。

私はsdiffのにsvn diffを送信するために私自身のスクリプトを書き、--diff-cmdによって指定されているので~/.subversion/configdiff3-cmd = /usr/local/bin/svndiff3を追加(またはコマンドラインパラメータに--diff3-cmdを使用します)。

このスクリプトはyolinuxに掲載されており、若干修正されたバージョン(自動マージを処理する)はJawspeakに掲載されています。

4

短く、(SVN 1.7.7でテスト)SVNのそれ以降のバージョンで動作するソリューション:

〜/ SVNのマージ - 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 

それをバインドするスクリプトを作成します。 〜/にあるsvnにsubversion/config

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

残念ながら、SVN 1.7.18で動作しません – villapx

関連する問題