2009-04-20 14 views
94

Khi hợp nhất một vài nhánh (sử dụng SVN 1.6.1) trong đó tệp đã được thêm vào cả hai nhánh (và sau đó làm việc trong các nhánh riêng biệt) đang nhận được một trong những cuộc xung đột cây mới:SVN cách giải quyết xung đột cây mới khi tệp được thêm vào hai nhánh

 C foo.txt 
    > local obstruction, incoming add upon merge 

tôi cần những thay đổi từ cả hai chi nhánh, nhưng cuộc xung đột cây không cho tôi .working thường lệ, & file .merge bên phải .merge-left - - đó là điều dễ hiểu do bản chất của cuộc xung đột. Có một vài xung đột trong số này, và những nơi mà việc xóa cùng một tệp đã xảy ra trên mỗi nhánh, nhưng chúng đơn giản để giải quyết.

Tôi làm cách nào để giải quyết vấn đề này? Sách đỏ của SVN (cho 1.6) không đề cập đến tình huống này.

Trả lời

39

Như đã đề cập trong một phiên bản cũ (2009) của "Tree Conflict" design tài liệu:

XFAIL mâu thuẫn từ việc hợp nhất của tiện ích này trên phiên bản tập tin

kiểm tra này thực hiện việc hợp nhất mà mang một bổ sung tập tin mà không cần lịch sử vào một tệp số hiện có phiên bản.
Đây phải là xung đột cây trên tệp của loại 'local obstruction, incoming add upon merge'. Các kỳ vọng cố định trong r35341.

(Điều này cũng được gọi là "cặp song sinh ma quỷ" trong ClearCase bằng cách này):
một tập tin được tạo ra hai lần (ở đây "thêm" hai lần) tại hai chi nhánh khác nhau, tạo ra hai lịch sử khác nhau cho hai yếu tố khác nhau, nhưng có cùng tên.

Giải pháp lý thuyết là hợp nhất thủ công các tệp đó (với công cụ tìm khác biệt bên ngoài) trong nhánh đích 'B2'.

Nếu bạn vẫn đang làm việc trên các chi nhánh nguồn, kịch bản lý tưởng sẽ được loại bỏ tập tin từ chi nhánh nguồn B1, sáp nhập trở lại B2-B1 để làm cho tập tin đó có thể nhìn thấy trên B1 (sau đó bạn sẽ làm việc trên cùng một yếu tố).
Nếu không thể kết hợp lại vì kết hợp chỉ xảy ra từ B1 đến B2, thì việc hợp nhất thủ công sẽ là cần thiết cho mỗi lần hợp nhất B1->B2.

+11

Nhưng làm cách nào bạn thực hiện hợp nhất thủ công mà không có tệp .merge- *? – Quantum7

+2

Tài liệu thiết kế "xung đột cây" là liên kết bị rotted: ( – whitey04

+2

Điều thú vị là ngay cả khi cả hai tệp được thêm đều _identical_ chúng vẫn hiển thị là xung đột. Điều này thực sự không được gắn cờ là xung đột. – SantiBailors

158

Tôi đã tìm thấy post suggesting a solution for that. Sắp chạy:

svn resolve --accept working <YourPath> 

sẽ yêu cầu tệp phiên bản cục bộ OK.
Bạn có thể chạy nó cho một tệp hoặc toàn bộ danh mục dự án.

+2

Cảm ơn, điều này cũng giải quyết: C foo.txt > thêm địa phương, gửi đến khi cập nhật – lazysoundsystem

+5

cảm ơn nó đã làm việc cho tôi, nhưng tôi đã phải làm điều này: svn giải quyết - chấp nhận làm việc FILENAME – ajacian81

+5

yeah bạn cần một tên tập tin.Nó chấp nhận '.' (thư mục hiện hành) .Tôi cũng cần phải làm điều này đệ quy như vậy: "svn resolve --accept working --recursive." giải quyết mọi thứ trong ủng hộ bản sao làm việc của bạn (nguy hiểm! Bạn có thể thổi bay những thay đổi của người khác khi bạn làm điều này, như thường lệ khi giải quyết xung đột) –

9

Điều gì xảy ra nếu thay đổi đến là những thay đổi bạn muốn? Tôi không thể chạy svn giải quyết --accept họ đầy

svn quyết tâm cơ sở --accept

+4

Tôi nghĩ rằng tôi đã hiểu sai câu hỏi. 'cơ sở' là, thực sự, tương đương với 'của họ đầy đủ' khi sử dụng 'giải quyết svn' nhưng nó không giải quyết vấn đề của bạn. Những gì tôi đã làm thay vào đó, là chia nó thành hai phần: 1) Xóa thư mục xung đột cục bộ của tôi (hoặc tệp), 2) Hợp nhất. Điều này sẽ chạy mà không có xung đột và vì 'các thay đổi đến là những thay đổi bạn muốn', tôi sẽ không quan tâm đến các mục đã xóa –

1

Tôi chỉ cố gắng nêm bản thân mình khá triệt để cố gắng làm theo lời khuyên của user619330 trên.Tình hình là: (1): Tôi đã thêm một số tập tin trong khi làm việc trên nhánh ban đầu của tôi, branch1; (2) Tôi đã tạo ra một nhánh mới, branch2 để phát triển hơn nữa, phân nhánh nó ra khỏi thân cây và sau đó hợp nhất các thay đổi của tôi từ branch1 (3) Một đồng nghiệp đã sao chép các mod của tôi từ branch1 đến nhánh của riêng mình, bổ sung thêm các mod, và sau đó sáp nhập trở lại thân cây; (4) Bây giờ tôi muốn hợp nhất các thay đổi mới nhất từ ​​thân cây vào nhánh làm việc hiện tại của tôi, branch2. Điều này là với svn 1.6.17.

Hợp nhất có xung đột cây với các tệp mới và tôi muốn phiên bản mới từ thân cây nơi chúng khác nhau, vì vậy từ một bản sao sạch của branch2, tôi đã xóa svn các tệp xung đột, cam kết các thay đổi branch2 này (do đó tạo ra một phiên bản tạm thời của branch2 mà không có các tập tin trong câu hỏi), và sau đó đã hợp nhất của tôi từ thân cây. Tôi đã làm điều này bởi vì tôi muốn lịch sử để phù hợp với phiên bản thân cây để tôi sẽ không có nhiều vấn đề sau này khi cố gắng hợp nhất trở lại thân cây. Merge đi tốt, tôi có phiên bản của các tập tin, svn st cho thấy tất cả ok, và sau đó tôi nhấn xung đột cây nhiều hơn trong khi cố gắng cam kết những thay đổi, giữa xóa tôi đã làm trước đó và thêm từ hợp nhất. Đã làm một giải quyết svn của các cuộc xung đột ủng hộ bản sao làm việc của tôi (mà bây giờ đã có phiên bản thân của các tập tin), và đã nhận nó để cam kết. Tất cả nên tốt, phải không?

Ồ, không. Bản cập nhật của một bản sao khác của branch2 dẫn đến phiên bản cũ của các tệp (hợp nhất trước thân cây). Vì vậy, bây giờ tôi có hai bản sao làm việc khác nhau của branch2, được cho là được cập nhật cho cùng một phiên bản, với hai phiên bản khác nhau của các tệp và cả hai đều nhấn mạnh rằng chúng được cập nhật đầy đủ! Kiểm tra một bản sao sạch của branch2 dẫn đến phiên bản cũ (pre-trunk) của các tập tin. Tôi tự cập nhật chúng lên phiên bản trunk và cam kết các thay đổi, quay trở lại bản sao làm việc đầu tiên của tôi (từ đó tôi đã gửi các thay đổi thân cây ban đầu), cố gắng cập nhật nó, và bây giờ có được một lỗi tổng kiểm tra trên các tập tin trong câu hỏi. Thổi các thư mục trong câu hỏi đi, có được một phiên bản mới thông qua cập nhật, và cuối cùng tôi có những gì nên là một phiên bản tốt của branch2 với những thay đổi thân cây. Tôi hi vọng. Caveat developer.