2011-01-26 27 views

Trả lời

28

Đến tập tin cấu hình Subversion (/etc/subversion/config hoặc ~/.subversion/config), và thiết lập merge-tool-cmd biến với công cụ yêu thích của bạn:

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

Mặc dù có một vấn đề với KDiff3 mà không hỗ trợ bốn đối số đồng bằng (SVN đi Bốn lập luận đơn giản để KDiff3, và nó không hoạt động), vì vậy nó thường được gọi với một kịch bản đơn giản để dịch các đối số, ví dụ: "kdiff3caller":

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

này vấn đề KDiff3 và sol ution được giải thích here.

+0

Tôi sẽ thử và xem nó hoạt động như thế nào. – gruszczy

+1

Để làm việc với các tên tệp có chứa dấu cách, sử dụng 'kdiff3" $ 1 "" $ 2 "" $ 3 "-o" $ 4 "'. – hlovdal

+2

Đối với tôi nó bắt đầu kdiff3 ok, nhưng nó dường như không hoạt động. Tôi làm một hợp nhất svn, khi có một cuộc xung đột tôi làm "khởi động (l)" và nó sẽ mở kdiff3 nhưng sau đó hợp nhất dường như không hoạt động. Nó tiết kiệm cho .svn/tmp nhưng lệnh svn merge chỉ lặp lại chính nó yêu cầu tôi một lần nữa phải làm gì. CHỈNH SỬA: OK, tệ của tôi. Tôi làm việc, nhưng bạn cần phải làm đầu tiên (l) khởi động, làm việc hợp nhất, và sau đó chọn (r) giải quyết. – PapaFreud

3

Tôi tìm thấy tập lệnh này ở đâu đó mà tôi không thể nhớ. nhưng tác giả là Michael Bradley.

Câu trả lời của tôi tương tự như câu trả lời của Jon Ander Ortiz Durántez. Vì vậy, nếu câu trả lời của anh ấy không hiệu quả, bạn có một bản sao lưu. Tôi đã từng thử một số thứ như anh ấy gợi ý, nhưng nó luôn xuất ra một số lỗi với các tham số cho đến khi tôi tìm thấy các tập lệnh này đã giải quyết mọi thứ.

Tạo một file kịch bản và thiết lập diff-cmd = /path/to/script.sh trong ~/.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

Kịch bản đó sẽ không thể xử lý tên tập tin với các khoảng trống mà không có nhiều sửa lỗi đối với các tham chiếu thay đổi thành '$ cũ' thành' "$ cũ" 'và tương tự. –

+1

Có thể bạn đã tìm thấy nó [ở đây] (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –

+0

@AdamSpiers, cảm ơn nguồn. – yvoyer

3

Các kịch bản của bạn từ câu trả lời yvoyer của hoạt động tuyệt vời đối với tôi, và tôi đang sử dụng SVN 1.4. Tôi nghĩ câu trả lời trước đó từ Jon Ander Ortiz Durántez hoạt động cho SVN 1.5 và cao hơn, và kịch bản này hoạt động cho các phiên bản SVN trước 1.5. Có vẻ như đã có những thay đổi đối với --diff-cmd & --diff3-cmd cho phiên bản 1.5. Hãy so sánh các kịch bản trong vòng 2 docs SVN sau đây để xem một số khác biệt:

Kịch bản của Michael Bradley thực sự hữu ích kể từ bây giờ nếu tôi gặp phải xung đột trong khi svn update, nó sẽ chuyển thành kdiff3 thay vì chặn tất cả các tệp bằng dấu "xung đột >>>>>>>> để giải quyết nếu bạn có những mối quan tâm phức tạp. Các diff3-cmd hoạt động cho cả hai hợp nhất và cập nhật.

tôi thêm diff3-cmd = /usr/local/bin/svndiff3-~/.subversion/config (hoặc sử dụng --diff3-cmd trên cmdline) kể từ khi tôi viết kịch bản riêng của tôi để gửi svn diff để sdiff và được xác định bởi --diff-cmd.

Tập lệnh này được đăng tại yolinux và phiên bản được sửa đổi một chút (xử lý tự động hợp nhất) được đăng tại đây Jawspeak.

4

Một giải pháp đó là ngắn hơn và làm việc với các phiên bản sau của SVN (thử nghiệm trên SVN 1.7.7):

Tạo một kịch bản ~/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 nó để svn trong ~ /.subversion/config

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

Không hoạt động trong SVN 1.7.18, thật không may – villapx

Các vấn đề liên quan