2010-08-20 17 views
23

Làm cách nào để hợp nhất chi nhánh trở lại thân cây trong SVN với tất cả lịch sử cam kết? Tôi biết trong Git tôi có thể sử dụngLàm thế nào để hợp nhất chi nhánh trở lại thân cây trong SVN với tất cả lịch sử cam kết?

merge -squash 

Có bất kỳ lệnh tương đương nào trong SVN không? Tôi đang sử dụng SVN 1.6.

+4

Phiên bản SVN nào đang chạy trên máy chủ? 1.5 và sau đó tạo ra sự khác biệt lớn cho câu hỏi của bạn so với 1.4 hoặc trước đó. –

Trả lời

35

Với Subversion 1.5 hoặc mới hơn hợp nhất được ghi trên bản sao làm việc cục bộ của bạn trong thuộc tính svn: mergeinfo. Vì vậy, thông tin này không bị mất.

Bạn có thể xem các bản sửa đổi đã hợp nhất nếu bạn sử dụng svn log -g thay vì thông thường svn log.

hòa trộn thông thường được thực hiện như

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

Nhưng nếu bạn sử dụng một chi nhánh đó là đôi khi thuận tiện hơn để sử dụng một tái hòa nhập hợp nhất. Trong trường hợp này đầu tiên bạn nên kết hợp tất cả những thay đổi thân cây đến chi nhánh sử dụng một cái gì đó giống như

svn merge svn://server/trunk my_branch_wc 

(này kết hợp tất cả những gì chưa được sáp nhập)

Và sau khi bạn cam kết thay đổi này đến chi nhánh bạn có thể sử dụng

svn merge --reintegrate svn://server/branch my_trunk_wc 

Để di chuyển tất cả các thay đổi trên dưới dạng một cam kết. (Sau hoạt động này, bạn nên loại bỏ các chi nhánh)

+0

_ "sau thao tác này bạn nên xóa nhánh" _. Tại sao, không nên chỉ là "có thể loại bỏ"? Tôi thích giữ tất cả lịch sử xung quanh miễn là nó không gây ra bất kỳ vấn đề nào. – Zitrax

+1

Lịch sử vẫn còn xung quanh trong bản sửa đổi cũ như bạn có thể thấy khi chạy 'svn log -g'. Nhưng bạn không nên sử dụng chi nhánh nữa vì nó không thể được sáp nhập lại mà không cần thêm sổ sách kế toán. (Lưu ý rằng nhiều phiên bản Subversion mới hơn (1.8+) đã giảm yêu cầu --reintegrate và thậm chí có thể làm cho nhánh có thể sử dụng lại với sự hợp nhất từ ​​thân cây) –

+0

@BertHuijben: Xin chào Ngài, bạn có thể xem xét câu hỏi của tôi không ] (http://stackoverflow.com/q/36157555/3287204)? Cảm ơn trước ... :) –

1

Bạn có thể lưu từng thay đổi thành khác và sau đó cam kết mỗi thay đổi trên đỉnh thân cây. Điều này thường được gọi là "cấy ghép" và có nhiều công cụ khác nhau để thực hiện việc này một cách tự động.

+2

Ví dụ về các công cụ đó? – turbanoff

5

Tôi hơi bị xáo trộn khi hợp nhất, nhưng điều đó không nên làm điều đó?

svn merge -rREV1:REV2 svn://server/branch my_trunk_wc 

Xem:

svn merge --help 
+1

nó sẽ chỉ hợp nhất vào bản sao làm việc của bạn, sau đó bạn sẽ cam kết - nhưng lịch sử thân cây sẽ nhớ chỉ cam kết này - mà không có những người từ chi nhánh –

+0

Tôi nghĩ rằng bạn đang phải ... Tôi đã nhầm lẫn với 'copy' giữ gìn lịch sử. – DarkDust

+2

Đây không phải là những gì 'svn: mergeinfo' là dành cho? – detly

0

Có vẻ như bạn muốn:

  1. Merge từ có thể nhiều chi nhánh.
  2. Có tất cả các hợp nhất được ghi chính xác như vậy.
  3. Cam kết chỉ là một bản sửa đổi mới.

Tôi nghĩ điều này được hỗ trợ bởi kiến ​​trúc SVN cơ bản. Nhưng tôi không biết nếu có bất kỳ khách hàng nào cung cấp nó (mặc dù svnmucc sẽ làm điều đó cho nhiều lệnh cp, mv, rm). Trừ khi bạn muốn làm nghiên cứu nhiều hơn tôi có (mà sẽ không mất nhiều), hoặc viết khách hàng của riêng bạn mà có thể lái xe các thư viện SVN để làm điều đó (có thể khó nhưng vẫn có thể thực hiện được); sau đó tôi nghĩ bạn sẽ phải hy sinh một trong 2. và 3. ở trên.

(Nếu bạn hy sinh 3, bạn có thể đổ kho ngay sau đó và hack tệp kết xuất chỉ sử dụng một bản sửa đổi, nhưng tôi không nghĩ rằng nó đáng rủi ro chỉ để có lịch sử sửa đổi đơn giản hơn ...)

1

Để tạo một kết hợp của một chi nhánh và tạo ra một cam kết duy nhất cho mỗi cam kết tại các chi nhánh bạn có thể sử dụng một kịch bản, tôi đang sử dụng như sau:

#/bin/bash 

BRANCH="http://your branch url" 

for i in {1127..1138} # list of revisions 
do 
    REV=$i 
    echo $REV $BRANCH 
    echo merged $REV from $BRANCH > tmps.commit 
    svn log -c $REV $BRANCH >> tmps.commit 
    svn up 
    svn merge -c $REV $BRANCH ./ 
    svn commit -F tmps.commit 
    rm tmps.commit 
done 

Điều này sẽ kiểm tra từng sửa đổi bạn chỉ định cho chi nhánh cụ thể và thực hiện cam kết trên thư mục hiện tại, do đó bảo toàn từng thay đổi duy nhất với thông báo tương ứng.

+0

Tôi chỉ sử dụng tập lệnh này thành công và nó hoạt động tốt. Việc xem xét duy nhất là khi kịch bản này lặp trên tất cả các số sửa đổi từ X đến N, chúng không hoàn toàn là số liên tiếp, chúng tôi có thể sửa đổi 1131 theo sau là sửa đổi 1135 chẳng hạn. Trong trường hợp này, chúng ta sẽ hợp nhất một sửa đổi trống cam kết vào nhánh mới tạo ra một cam kết không có thay đổi. Tôi có thể sửa đổi kịch bản này lần sau để kiểm tra xem tmps.commit có trống không và nếu có 'tiếp tục' để tránh những cam kết không thay đổi thêm này. Vì SVN không cho phép một cam kết mà không có một bình luận, điều này sẽ hoạt động như mong đợi. – jcpennypincher

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