svn: thay thân cây bằng nhánh


155

Cách tốt nhất để làm cho một trong các nhánh của kho lưu trữ lật đổ là thân cây mới là gì?

Đã có một bản viết lại chính cho toàn bộ hệ thống: mọi thứ đã được di chuyển xung quanh, viết lại, thay thế, loại bỏ, đổi tên, v.v. Mã viết lại đã được thử nghiệm và sẵn sàng để thay thế thân cây cũ.

Về cơ bản, dòng chính cũ (Trunk 5) được gắn thẻ và sẽ kết thúc tại đây. Chi nhánh viết lại (Chi nhánh 6) sẽ trở thành tuyến chính mới (Trunk 7):

Thân cây (1) -> Thân cây (2) -> Thân cây (5) -> × + -> Thân cây mới (7)
  \ \ |
  hợp nhất ngã ba ???
    \ \ |
     + -> Chi nhánh (3) -> Chi nhánh (4) -> Chi nhánh (6) - +

Tất cả các thay đổi đang diễn ra từ 'Thân cây' cũ đã được tích hợp vào 'Chi nhánh được viết lại'

Tôi có thể làm cái này như thế nào?

Câu trả lời:


118

Sử dụng di chuyển svn để di chuyển nội dung của thân cây cũ ở một nơi khác và đổi tên nhánh thành thân cây sau đó.

Lưu ý rằng sao chép và di chuyển trong svn hoạt động như các hoạt động tập tin. Bạn có thể sử dụng chúng để di chuyển / sao chép nội dung xung quanh trong kho lưu trữ của mình và những thay đổi này cũng được phiên bản. Hãy nghĩ về "di chuyển" là "sao chép + xóa".

[EDIT] Nilbus chỉ thông báo cho tôi rằng bạn sẽ nhận được xung đột hợp nhất khi bạn sử dụng svn move.

Tôi vẫn nghĩ rằng đây là cách tiếp cận chính xác. Nó sẽ gây ra xung đột nhưng nếu bạn hợp nhất cẩn thận, rất có thể bạn sẽ không mất bất kỳ dữ liệu nào. Nếu điều đó làm phiền bạn, hãy sử dụng một VCS tốt hơn như Mercurial hoặc Git .


1
Nếu bạn làm điều này, bất kỳ ai có thay đổi trong bản sao làm việc trong thân cây ban đầu sẽ có xung đột, ngay cả khi những thay đổi của họ sẽ hợp nhất. Điều này là do các tệp bị xóa và thêm lại - chúng được coi là các đối tượng riêng biệt có lịch sử riêng biệt.
Edward Anderson

@nilbus: Bạn đã thử chưa? IIRC, SVN cho thấy các tệp đã bị xóa và được gắn lại nhưng bên trong, nó sẽ biết rằng các tệp đã được di chuyển.
Aaron Digulla

Đúng. Tôi đã kiểm tra hai bản. Trong bản sao đầu tiên, tôi đã chuyển dir A sang A2 và dir B sang A. Sau đó chuyển A sang B, sau đó chuyển sang A. (đổi tên và đổi tên trở lại.) Trong lần kiểm tra thứ 2, tôi đã thay đổi một tập tin và cố gắng svn cập nhật. Nó bị xung đột vì tập tin tôi thay đổi "đã bị xóa". Trong nội bộ, nó không lưu các bản sao của các tệp trùng lặp, nhưng Xóa mà bạn thấy thực sự ảnh hưởng đến bạn khi xảy ra xung đột.
Edward Anderson

12
@nilbus: Tại thời điểm này, tôi muốn trích dẫn Linus Torvalds: "Khẩu hiệu của Subversion trong một thời gian là" CVS được thực hiện đúng ", hoặc một cái gì đó tương tự, và nếu bạn bắt đầu với loại khẩu hiệu đó, không nơi nào bạn có thể đi. Không có cách nào để làm CVS đúng. "
Aaron Digulla

3
Vâng. Tôi sẽ đồng ý. Để giải quyết vấn đề này, tôi thực sự đã kiểm tra repo bằng svn-git và sử dụng git để khởi động lại nhánh trên master.
Edward Anderson

66

Tôi đồng ý với việc sử dụng lệnh di chuyển svn để thực hiện mục tiêu này.

Tôi biết những người khác ở đây nghĩ rằng nó khác thường, nhưng tôi thích làm theo cách này. Khi tôi có một nhánh tính năng và sẵn sàng hợp nhất nó với một thân cây cũng đã được sửa đổi đáng kể, tôi sẽ hợp nhất nó với một nhánh mới, thường được đặt tên <FeatureBranchName>-Merged. Sau đó, tôi giải quyết xung đột và kiểm tra mã hợp nhất. Sau khi hoàn thành, tôi chuyển thân cây vào thư mục thẻ để không mất gì cả. Cuối cùng tôi di chuyển<FeatureBranchName>-Merged đến thân cây.

Ngoài ra, tôi muốn tránh các bản sao làm việc khi thực hiện các động tác, đây là các mẫu của các lệnh:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Lưu ý: Tôi sử dụng 1.5


1
Đó có thể không phải là cách thực hành tốt nhất nhưng chắc chắn là hiệu quả nhất khi bạn có một thân cây rất cũ và mọi người làm việc trên một nhánh như thể đó là thân cây. Nó giải quyết vấn đề của tôi!
Alex Perrin

12

Gần đây tôi chỉ nhìn vào vấn đề này và giải pháp mà tôi rất hài lòng là thực hiện

hợp nhất svn --ignore-aneopry trunk-url Branch-url

trên bản sao làm việc của thân cây của tôi.

Điều này không cố gắng áp dụng các thay đổi theo cách lịch sử (duy trì các thay đổi trong thân cây). Nó chỉ đơn giản là "áp dụng khác biệt" giữa thân cây và nhánh. Điều này sẽ không tạo ra bất kỳ xung đột nào cho người dùng của bạn trong các tệp không được sửa đổi. Tuy nhiên, bạn sẽ mất thông tin Lịch sử của mình từ chi nhánh, nhưng điều đó xảy ra khi bạn thực hiện hợp nhất bằng mọi cách.


1
Đăng svn 1.5 bạn sẽ có thể thực hiện hợp nhất lưu giữ lịch sử.
NSherwin

9

Đề nghị bạn thực hiện những thay đổi này thông qua công cụ trình duyệt kho lưu trữ.

Cố gắng xóa lớn + di chuyển các hoạt động thông qua bản sao làm việc là một cách tuyệt vời để giết bản sao làm việc. Nếu bạn buộc phải sử dụng bản sao làm việc, hãy thực hiện các cam kết gia tăng sau mỗi lần xóa hoặc di chuyển thao tác và CẬP NHẬT bản sao làm việc của bạn sau mỗi lần xác nhận.


Liên kết đến Repo sẽ hữu ích (chỉ để thuận tiện - lưu tìm kiếm trên google :))
Brian M. Hunt

3
Lấy làm tiếc. Chính tả làm cho nó trông giống như tôi đang đề cập đến một công cụ cụ thể (được chỉnh sửa). Trên thực tế, hầu hết các công cụ GUI SVN nên có tính năng trình duyệt kho lưu trữ. FYI: Tôi sử dụng rùa tortoisesvn.tigris.org
Chris Nava

4

Nếu bạn muốn tạo nhánh cho thân cây mới (nghĩa là) loại bỏ tất cả các thay đổi trong thân cây được tạo từ khi nhánh được tạo, bạn có thể 1. Tạo một nhánh của thân cây (cho mục đích sao lưu) 2. "hoàn nguyên các thay đổi "Trên thân cây (chọn tất cả các sửa đổi sau khi nhánh được tạo 3. Hợp nhất nhánh trở lại thân cây.

Lịch sử nên được giữ nguyên theo cách này.

Trân trọng, Roger


3

Các giải pháp @Aaron Digulla và @kementeus hoàn toàn khả thi. Đối với các kho lưu trữ Subversion 1.4, các hoạt động sao chép / di chuyển có thể khiến việc di chuyển trong tương lai sang một cấu trúc kho lưu trữ khác hoặc việc chia tách các kho lưu trữ trở nên khó khăn.

Tôi tin rằng những cải tiến của 1.5 bao gồm độ phân giải lịch sử di chuyển / sao chép tốt hơn, vì vậy có lẽ nó không phải là vấn đề đối với kho lưu trữ 1.5.

Đối với kho lưu trữ 1.4, tôi khuyên bạn nên sử dụng svnadmin dumpsvndumpfilter thực hiện chuyển động của thân cây hiện có ở nơi khác, sau đó di chuyển nhánh đến thân cây với cùng một cơ chế. Tải hai tệp tin lưu trữ vào kho lưu trữ kiểm tra, xác minh, sau đó chuyển nó sang sản xuất.

Tất nhiên, sao lưu kho lưu trữ hiện tại của bạn trước khi bắt đầu.

Điều này bảo tồn lịch sử mà không ghi lại di chuyển / sao chép rõ ràng và làm cho tổ chức lại trong tương lai, bảo tồn lịch sử, dễ dàng hơn.


Chỉnh sửa: Theo yêu cầu, tài liệu về hành vi 1.4, từ cuốn sách Red-Bean 1.4, Lọc lịch sử kho lưu trữ

Ngoài ra, các đường dẫn sao chép có thể cung cấp cho bạn một số rắc rối. Subversion hỗ trợ các hoạt động sao chép trong kho lưu trữ, trong đó một đường dẫn mới được tạo bằng cách sao chép một số đường dẫn đã tồn tại. Có thể tại một số thời điểm trong vòng đời của kho lưu trữ của bạn, bạn có thể đã sao chép một tệp hoặc thư mục từ một vị trí svndumpfilterkhông bao gồm, đến một vị trí mà nó bao gồm. Để làm cho dữ liệu kết xuất tự túc,svndumpfiltervẫn cần hiển thị bổ sung đường dẫn mới, bao gồm cả nội dung của bất kỳ tệp nào được tạo bởi bản sao và không thể hiện sự bổ sung đó dưới dạng bản sao từ nguồn không tồn tại trong luồng dữ liệu được lọc của bạn. Nhưng vì định dạng kết xuất kho lưu trữ Subversion chỉ hiển thị những gì đã thay đổi trong mỗi lần sửa đổi, nên nội dung của nguồn sao chép có thể không có sẵn. Nếu bạn nghi ngờ rằng bạn có bất kỳ bản sao nào của loại này trong kho lưu trữ của mình, bạn cũng có thể muốn suy nghĩ lại về bộ đường dẫn được bao gồm / loại trừ của mình, có lẽ bao gồm cả các đường dẫn đóng vai trò là nguồn của các hoạt động sao chép rắc rối của bạn.

Điều này áp dụng cho việc di chuyển / sắp xếp lại bằng cách sử dụng svndumpfilter. Đôi khi, một công việc làm thêm bây giờ có thể tiết kiệm rất nhiều công việc làm thêm sau đó và bằng cách sử dụng dễ dàng svndumpfiltercó sẵn cho việc di chuyển / sắp xếp lại trong tương lai sẽ giảm thiểu rủi ro với chi phí tương đối thấp.


Tại sao "svn di chuyển" không đủ? Đề nghị của bạn có vẻ giống như đập một con ruồi bằng búa tạ.
Rob Williams

Tôi đã bị cắn bởi hành vi 1.4 này - nếu kho lưu trữ SVN chứa di chuyển (đổi tên) thư mục hoặc chi nhánh / thẻ, sử dụng svndumpfilter để giúp tổ chức lại / di chuyển kho lưu trữ sang cấu trúc mới có thể thất bại vì nó không xử lý được lịch sử tốt. Nó được ghi lại, tôi sẽ đào ref. nếu bạn thích
Ken Gentle

Bạn có thể thêm tài liệu tham khảo cho hành vi này?
Jacco

2

Mặc dù các câu trả lời ở trên sẽ có hiệu quả, nhưng chúng không phải là cách thực hành tốt nhất. Máy chủ svn và theo dõi khách hàng mới nhất hợp nhất cho bạn. Vì vậy, svn biết bản sửa đổi nào bạn đã sáp nhập vào một chi nhánh và từ đâu. Điều này giúp ích rất nhiều khi giữ cho một chi nhánh được cập nhật và sau đó hợp nhất nó trở lại vào thân cây.

Tuy nhiên, cho dù bạn đang sử dụng phiên bản Subversion nào, có một phương pháp thực hành tốt nhất để đưa các thay đổi trong một nhánh trở lại vào thân cây. Nó được phác thảo trong hướng dẫn Subversion: Kiểm soát phiên bản với Subversion, Chương 4. Phân nhánh và hợp nhất, Giữ một nhánh trong đồng bộ hóa .


Thx cho thông tin chính thức để tôi có thể hợp nhất chi nhánh vào thân cây bằng cách phê duyệt chính thức. Từ khóa được tái hòa nhập
Junyo

-3

Đó là một cấu hình thực sự kỳ lạ / bất thường trong SVN, thậm chí tôi nghĩ rằng nó không phải là một "thực hành tốt", dù sao, tôi đoán bạn có thể làm một cái gì đó như:

  • Kiểm tra tất cả các sourcetree (svn co Therootsourcetree)
  • Xóa thân cây (svn rm trunk)
  • Sao chép nhánh vào thân cây (svn cp cành / thebranch / trunk)
  • Xóa chi nhánh (svn rm chi nhánh / thebranch)
  • Cam kết thay đổi

Chúc may mắn


9
Điều này phá hủy dấu vết lịch sử sẽ được bảo tồn bằng "di chuyển svn".
Rob Williams
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.