Tôi muốn có thể giải quyết xung đột bằng cách sử dụng kdiff3, khi SVN thông báo cho tôi về xung đột. Làm thế nào tôi có thể thiết lập nó như một công cụ mặc định cho việc này?Cách đặt kdiff3 làm công cụ hợp nhất cho SVN
Trả lời
Đế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.
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
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ự. –
Có thể bạn đã tìm thấy nó [ở đây] (https://negativesum.net/tech/log/using-kdiff3-with-svn/)? –
@AdamSpiers, cảm ơn nguồn. – yvoyer
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:
- svnbook.red-bean.com/en/1.4/svn.advanced.externaldifftools &
- svnbook.red-bean.com/en/1.5/svn.advanced.externaldifftools.
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.
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
Không hoạt động trong SVN 1.7.18, thật không may – villapx
- 1. Lưu hợp nhất bằng KDiff3 với TortoiseSVN
- 2. Công cụ hợp nhất cho mã C#
- 3. tích hợp smartgit và kdiff3
- 4. GVim làm công cụ hợp nhất cho TFS
- 5. Công cụ hợp nhất hình ảnh tốt nhất cho Git là gì?
- 6. Công cụ hợp nhất ngữ nghĩa
- 7. Công cụ cài đặt tốt nhất cho java là gì?
- 8. SVN hợp nhất câu hỏi
- 9. Làm thế nào để sử dụng p4merge như công cụ hợp nhất/khác biệt cho Mercurial?
- 10. Làm thế nào để SVN hợp nhất thân cây thành một nhánh (SVN 1.6) bằng cách sử dụng Tortoise SVN
- 11. Công cụ để duy trì các chi nhánh trong SVN
- 12. Làm cách nào để xóa ứng viên hợp nhất khỏi công cụ Hợp nhất trong Hệ thống Nhóm?
- 13. Luồng công việc git-svn để hợp nhất bằng cách sử dụng svn.pushmergeinfo
- 14. Hợp nhất các công cụ bỏ qua các dòng Id $
- 15. Làm cách nào để kết hợp "của chúng ta" bằng công cụ kết hợp git Eclipse?
- 16. SVN hợp nhất sáp nhập thêm thứ
- 17. git-svn hợp nhất 2 chi nhánh svn
- 18. Thay đổi mặc định SVN diffing công cụ
- 19. Cách tốt nhất để tích hợp công cụ xây dựng bên ngoài vào Eclipse là gì?
- 20. Công cụ tích hợp liên tục nào là tốt nhất cho một dự án C++?
- 21. kdiff3 merge không hoạt động
- 22. Chuỗi công cụ nhanh nhất cho Qt là gì?
- 23. Công cụ phiên bản git thích hợp nhất cho nhiều tệp nhỏ
- 24. Công cụ tổng hợp cho nhiều trình theo dõi lỗi/vấn đề không đồng nhất?
- 25. Thực hành tốt nhất hợp nhất một phần SVN
- 26. Công cụ hợp nhất dòng lệnh tương tác GUI (như BeyondCompare hoặc WinMerge) cho Linux
- 27. Bất kỳ công cụ phân biệt/hợp nhất văn bản nào cho .NET?
- 28. Căn chỉnh chênh lệch thủ công trong KDiff3
- 29. cách đặt tiêu điểm cho ô cụ thể của bộ dữ liệu bộ công cụ WPF
- 30. Công cụ tốt nhất để tạo MSI
Tôi sẽ thử và xem nó hoạt động như thế nào. – gruszczy
Để 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
Đố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