2009-04-16 27 views
11

Chúng tôi có một số tiểu dự án lớn trong dự án SVN chính của chúng tôi.
Tôi cam kết và hợp nhất chỉ tiểu dự án của tôi khi làm việc với các nhánh phát hành của chúng tôi, chủ yếu là vì nó nhanh hơn.Cam kết và hợp nhất trên các thư mục con SVN được coi là có hại?

Tuy nhiên, một đồng nghiệp chỉ ra điều này reference to merging subdirectories in Version Control with Subversion (aka "Các SVN Book"):

Thật không may, đây là mức độ cảnh báo. Phần được liên kết cũng không đưa ra lời giải thích.

Cam kết và hợp nhất các thư mục con SVN có hại cho các nhánh phát hành không?
Còn các nhánh tính năng ngắn hạn thì sao?

+0

Tôi thích tiêu đề :) – Dunaril

Trả lời

14

Một giải thích có thể là bạn có thể quên các phần của bộ thay đổi.

Nếu thay đổi đặt bạn đang hợp nhất các tệp bìa nằm ngoài thư mục con mà bạn đã kiểm tra, thì luôn có khả năng bạn sẽ quên hợp nhất các tệp đó.

Ví dụ, nếu bạn có một cam kết như thế này trên thân cây:

r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines 
Changed paths: 
    M /trunk/subdir1/main.c 
    M /trunk/subdir2/main.c 

Change some stuff 

Và sau đó bạn có một kiểm tra của subdir1 từ chi nhánh của bạn "ổn định", sau đó bạn có thể hợp nhất các thay đổi thiết lập r5 như thế này:

$ svn co http://example.com/svn/branches/stable/subdir1 
$ cd subdir1 
$ svn merge -c 5 http://example.com/svn/trunk/subdir1 . 
--- Merging r5 into '.': 
U main.c 
$ svn ci -m"Merged r5 from trunk" 

Nhưng điều này sẽ chỉ hợp nhất một nửa số phiên bản 5. Tệ hơn nữa, nếu bạn quay trở lại và nhìn vào nhật ký, bây giờ nó sẽ hiển thị này:

$ svn log -g http://example.com/svn/ 
... 
------------------------------------------------------------------------ 
r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines 
Changed paths: 
    M /trunk/subdir1/main.c 
    M /trunk/subdir2/main.c 
Merged via: r6 

Change some stuff 

Vì vậy, có vẻ như bạn đã hợp nhất toàn bộ cam kết, khi thực tế bạn chỉ hợp nhất một số. Tất nhiên r6 không cho thấy chỉ có 1 tập tin đã thay đổi trên nhánh ổn định.

------------------------------------------------------------------------ 
r6 | rich | 2009-04-16 22:28:16 +0200 (Thu, 16 Apr 2009) | 1 line 
Changed paths: 
    M /branches/stable/subdir2 
    M /branches/stable/subdir2/main.c 

Merge revision 5 from trunk 

Ai đó phải nhớ hoặc thông báo rằng chỉ một phần của bộ thay đổi đã được hợp nhất và phần còn lại cần thực hiện. Không sử dụng kết hợp thư mục con để tránh sự cố này.

Có những lúc bạn thực sự không muốn hợp nhất tất cả các cam kết trước đó và kịch bản trên là chính xác những gì bạn định làm. Trong trường hợp đó, tốt nhất là nên thêm thông điệp cam kết mô tả ý định của bạn.

+1

+1 - Câu trả lời hay và ví dụ –

1

Cam kết không có vấn đề gì, nhưng khi hợp nhất SVN theo dõi nội dung và không được hợp nhất.

Vì vậy, tôi giả sử bạn muốn hợp nhất tại gốc để đơn giản hóa việc hợp nhất trong tương lai (đối với kích thước tập dữ liệu được so sánh bởi SVN).

1

Đối với phiên bản lật đổ trước 1.5, việc hợp nhất các thư mục con được thực hiện sau đó hợp nhất phần còn lại của cây thư mục thực sự phức tạp. Nếu bạn hợp nhất một thư mục, svn chỉ áp dụng tất cả các thay đổi được thực hiện trong thư mục đó cho nhánh khác.Nếu bạn đã hợp nhất một thư mục con rồi cố gắng hợp nhất thư mục chính, tất cả các thay đổi trong thư mục con đã có trong nhánh đích (vì bạn đã hợp nhất chúng trước đó). Svn bây giờ không biết rằng những thay đổi này là từ một hợp nhất trước đó, nó chỉ thấy rằng có những thứ "trong cách" khi nó đã cố gắng để hợp nhất các thư mục con, dẫn đến rất nhiều xung đột.

Để tránh điều này, bạn sẽ phải cẩn thận để chỉ hợp nhất các thư mục mà bạn chưa hợp nhất trước đây, làm cho toàn bộ quá trình phức tạp hơn nhiều. Bạn phải nhớ chính xác những sửa đổi nào trong đó các thư mục con mà bạn đã hợp nhất và chỉ áp dụng các thay đổi còn lại của các thư mục/bản sửa đổi còn lại. Điều này có thể gây nhầm lẫn. Luôn sát nhập toàn bộ nhánh làm việc này dễ dàng hơn nhiều. Các phiên bản lật đổ hiện tại theo dõi các lần hợp nhất trước đó trong nội bộ, để tránh những vấn đề này.

Cam kết thư mục con không có vấn đề gì. Đối với svn, đây chỉ là bản sửa đổi bình thường, toàn cầu của kho lưu trữ. Trong bản sửa đổi đó sẽ chỉ có thay đổi trong một thư mục con, nhưng đối với svn nó vẫn là một phiên bản mới của toàn bộ kho lưu trữ, giống như bất kỳ cam kết nào khác.

+2

Trong svn 1.5+, đây không phải là trường hợp thực sự. Hợp nhất thư mục con, sau đó hợp nhất phần còn lại của cùng một cam kết từ gốc không "hợp nhất lại" nội dung đã được hợp nhất trong thư mục con gây ra xung đột. Thuộc tính svn: mergeinfo ngăn không cho nó xảy ra. – richq

+0

Rất vui khi biết điều đó. Nó thực sự làm cho sự lật đổ sáp nhập không cần thiết và khó chịu phức tạp, đến mức vô dụng. – sth

5

Một lý do khác cho điều này có thể là việc hợp nhất chỉ với gốc giới hạn số thuộc tính svn: mergeinfo sẽ được đặt trên thư mục/tệp trong kho lưu trữ của bạn.

+0

Câu trả lời của bạn là nhiều hơn trong tinh thần của câu hỏi của tôi, cảm ơn. Cảm giác ruột của tôi là vì các tiểu dự án của chúng tôi chỉ có một cấp độ sâu, việc thiết lập mergeinfo trên một trong số đó vẫn hợp lý. – mskfisher

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