Câu hỏi "Chi nhánh", "thẻ" và "thân cây" có nghĩa là gì trong các kho lưu trữ Subversion?


Tôi đã nhìn thấy những từ này rất nhiều xung quanh thảo luận Subversion (và tôi đoán chung kho). Tôi đã sử dụng SVN cho các dự án của mình vài năm qua, nhưng tôi chưa bao giờ nắm được khái niệm hoàn chỉnh về những thư mục này.

Có ý nghĩa gì?


1133
2017-08-19 13:22


gốc


Dưới đây là một bài viết hay mà tôi đã giải thích về cách thức / thời điểm sử dụng thân cây, nhánh và thẻ. Tôi đã không sử dụng kiểm soát nguồn trước đây, nhưng bài viết này đã làm cho nó khá dễ dàng cho một noob như tôi hiểu. Ngày-to-ngày với Subversion - badmoon


Các câu trả lời:


Hmm, không chắc tôi đồng ý với thẻ Nick lại giống với một chi nhánh. Thẻ chỉ là một điểm đánh dấu

  • Thân cây sẽ là cơ quan phát triển chính, có nguồn gốc từ khi bắt đầu dự án cho đến hiện tại.

  • Chi nhánh sẽ là một bản sao của mã có nguồn gốc từ một điểm nhất định trong thân cây được sử dụng để áp dụng những thay đổi lớn cho mã trong khi vẫn giữ nguyên tính toàn vẹn của mã trong thân cây. Nếu những thay đổi lớn hoạt động theo kế hoạch, chúng thường được sáp nhập trở lại vào thân cây.

  • Nhãn sẽ là một điểm trong thời gian trên thân cây hoặc một chi nhánh mà bạn muốn bảo tồn. Hai lý do chính để bảo quản có thể là đây là bản phát hành chính của phần mềm, cho dù là alpha, beta, RC hay RTM hay đây là điểm ổn định nhất của phần mềm trước khi áp dụng các phiên bản chính trên thân cây.

Trong các dự án nguồn mở, các chi nhánh chính không được các bên liên quan tham gia dự án chấp nhận vào thân cây có thể trở thành cơ sở cho dĩa - ví dụ: các dự án hoàn toàn riêng biệt có chung nguồn gốc với mã nguồn khác.


867
2017-08-19 13:35



Sự nhầm lẫn với các thẻ và các chi nhánh là trong svn có thực sự là không có sự phân biệt giữa chúng, bên cạnh tên của thư mục. Trong svn bạn có thể thực hiện các thay đổi đối với một thẻ, và trên thực tế rất khó để ngăn chặn điều này. Hầu hết các VCS khác xử lý các thẻ như ảnh chụp nhanh bất biến (điểm trong thời gian). - Ken Liu
Tags thư mục cũng thường được sử dụng để kiểm tra mốc và xác minh bởi người dùng thông thường. Đây sẽ là một nơi tốt để đặt một mẫu thử nghiệm quá (chỉ là một số ý tưởng trên đầu của tôi). - Jeff Noel
@KenLiu Có móc có thể làm cho thẻ không thay đổi được. Tức là, bạn có thể tạo và kiểm tra thẻ nhưng không thực hiện bất kỳ thay đổi nào. Tất nhiên, một thẻ chỉ là một phần của kho lưu trữ có nghĩa là lịch sử đầy đủ có sẵn. Nếu ai đó thay đổi thẻ, bạn có thể theo dõi thẻ đó và tại sao. Trong nhiều VCS, nếu bạn sửa đổi một thẻ, có thể không có cách nào để biết. - David W.
Có lẽ cành ổn định nên được đề cập: những thay đổi được thực hiện thường không sáp nhập trở lại vào thân cây. - Wolf
Sự hiểu biết của tôi là trong một "thế giới hoàn hảo", không có sự phát triển nào xảy ra trong thân cây, thân cây phải luôn là mã chính xác đang tồn tại hoặc mã sắp được phát hành trực tiếp. như vậy sẽ làm cho các chi nhánh trở thành cơ quan phát triển chính. - MikeT


Trước hết, như @AndrewFinnell và @KenLiu chỉ ra, trong SVN, các tên thư mục có nghĩa là không có gì - "trunk, branch và tags" đơn giản là một quy ước chung được sử dụng bởi hầu hết các kho lưu trữ. Không phải tất cả các dự án đều sử dụng tất cả các thư mục (thông thường là không sử dụng "thẻ"), và trên thực tế, không có gì ngăn bạn gọi chúng là bất cứ thứ gì bạn muốn, mặc dù phá vỡ quy ước thường gây nhầm lẫn.

Tôi sẽ mô tả có lẽ là kịch bản sử dụng phổ biến nhất của các chi nhánh và thẻ, và đưa ra một kịch bản ví dụ về cách chúng được sử dụng.

  • Thân cây: Khu vực phát triển chính. Đây là nơi phát hành chính mã tiếp theo của bạn, và thường có tất cả các tính năng mới nhất.

  • Chi nhánh: Mỗi khi bạn phát hành một phiên bản chính, nó sẽ tạo ra một nhánh. Điều này cho phép bạn thực hiện các bản sửa lỗi và tạo bản phát hành mới mà không phải phát hành các tính năng mới nhất - có thể chưa hoàn thành hoặc chưa được kiểm tra.

  • Thẻ: Mỗi lần bạn phát hành một phiên bản (bản phát hành cuối cùng, các ứng cử viên phát hành (RC) và các bản beta) bạn tạo một thẻ cho nó. Điều này cung cấp cho bạn bản sao mã thời gian như ở trạng thái đó, cho phép bạn quay lại và tạo lại bất kỳ lỗi nào nếu cần trong phiên bản trước hoặc phát hành lại phiên bản cũ như chính xác. Các nhánh và thẻ trong SVN có trọng lượng nhẹ - trên máy chủ, nó không tạo một bản sao đầy đủ của các tệp, chỉ là một điểm đánh dấu cho biết "các tệp này đã được sao chép ở bản sửa đổi này" chỉ chiếm vài byte. Với điều này trong tâm trí, bạn không bao giờ nên quan tâm đến việc tạo ra một thẻ cho bất kỳ mã phát hành. Như tôi đã nói trước đó, các thẻ thường bị bỏ qua và thay vào đó, một thay đổi hoặc tài liệu khác làm rõ số sửa đổi khi một bản phát hành được tạo ra.


Ví dụ: giả sử bạn bắt đầu một dự án mới. Bạn bắt đầu làm việc trong "trunk", trên những gì cuối cùng sẽ được phát hành như phiên bản 1.0.

  • trunk / - phiên bản phát triển, sắp tới là 1.0
  • chi nhánh / - trống

Sau khi hoàn thành 1.0.0, bạn phân nhánh nhánh thành nhánh "1.0" mới và tạo thẻ "1.0.0". Bây giờ làm việc trên những gì cuối cùng sẽ được 1,1 tiếp tục trong thân cây.

  • trunk / - phiên bản phát triển, sớm là 1.1
  • nhánh / phiên bản 1.0 - 1.0.0
  • phiên bản phát hành thẻ / 1.0.0 - 1.0.0

Bạn gặp một số lỗi trong mã và sửa chúng trong thân cây, sau đó hợp nhất các bản sửa lỗi cho nhánh 1.0. Bạn cũng có thể làm ngược lại, và sửa các lỗi trong nhánh 1.0 và sau đó hợp nhất chúng lại với thân cây, nhưng các dự án thường dính với việc sáp nhập một chiều để giảm bớt cơ hội thiếu một cái gì đó. Đôi khi một lỗi chỉ có thể được sửa trong 1.0 vì nó đã lỗi thời trong 1.1. Nó không thực sự quan trọng: bạn chỉ muốn chắc chắn rằng bạn không phát hành 1,1 với các lỗi tương tự đã được sửa trong 1.0.

  • trunk / - phiên bản phát triển, sớm là 1.1
  • chi nhánh / 1.0 - bản phát hành sắp tới 1.0.1
  • phiên bản phát hành thẻ / 1.0.0 - 1.0.0

Khi bạn tìm thấy đủ lỗi (hoặc có thể là một lỗi nghiêm trọng), bạn quyết định thực hiện bản phát hành 1.0.1. Vì vậy, bạn tạo một thẻ "1.0.1" từ nhánh 1.0 và giải phóng mã. Tại thời điểm này, trunk sẽ chứa những gì sẽ là 1.1, và nhánh "1.0" chứa mã 1.0.1. Lần sau khi bạn phát hành bản cập nhật lên 1.0, nó sẽ là 1.0.2.

  • trunk / - phiên bản phát triển, sớm là 1.1
  • chi nhánh / 1.0 - bản phát hành sắp tới 1.0.2
  • phiên bản phát hành thẻ / 1.0.0 - 1.0.0
  • tags / 1.0.1 - Phiên bản phát hành 1.0.1

Cuối cùng bạn gần như đã sẵn sàng để phát hành phiên bản 1.1, nhưng trước tiên bạn muốn thực hiện bản beta. Trong trường hợp này, bạn có thể làm một nhánh "1.1" và một thẻ "1.1beta1". Bây giờ, làm việc trên những gì sẽ là 1,2 (hoặc 2,0 có thể) tiếp tục trong thân cây, nhưng làm việc trên 1,1 tiếp tục trong "1,1" chi nhánh.

  • trunk / - phiên bản phát triển, sớm được 1.2
  • branch / 1.0 - bản phát hành sắp tới 1.0.2
  • nhánh / 1.1 - bản phát hành sắp tới 1.1.0
  • phiên bản phát hành thẻ / 1.0.0 - 1.0.0
  • tags / 1.0.1 - Phiên bản phát hành 1.0.1
  • thẻ / 1.1beta1 - phiên bản 1.1 beta 1 phát hành

Khi bạn phát hành phiên bản 1.1 final, bạn thực hiện thẻ "1.1" từ nhánh "1.1".

Bạn cũng có thể tiếp tục duy trì 1.0 nếu muốn, chuyển các bản sửa lỗi giữa cả ba nhánh (1.0, 1.1 và trunk). Điều quan trọng là mỗi phiên bản chính của phần mềm bạn đang duy trì, bạn có một nhánh chứa phiên bản mã mới nhất cho phiên bản đó.


Việc sử dụng các nhánh khác là dành cho các tính năng. Đây là nơi bạn chi nhánh thân cây (hoặc một trong các nhánh phát hành của bạn) và làm việc trên một tính năng mới trong sự cô lập. Khi tính năng hoàn tất, bạn hợp nhất nó trở lại và loại bỏ nhánh.

  • trunk / - phiên bản phát triển, sắp có 1.2
  • nhánh / 1.1 - bản phát hành sắp tới 1.1.0
  • branch / ui-rewrite - chi nhánh tính năng thử nghiệm

Ý tưởng về điều này là khi bạn đang làm việc về điều gì đó gây rối (điều đó sẽ cản trở hoặc can thiệp vào người khác từ việc thực hiện công việc của họ), một cái gì đó thử nghiệm (có thể thậm chí không làm được), hoặc có thể chỉ là một cái gì đó mất một thời gian dài (và bạn sợ nếu nó giữ bản phát hành 1.2 khi bạn đã sẵn sàng để chi nhánh 1.2 từ thân cây), bạn có thể làm điều đó trong sự cô lập trong chi nhánh. Nói chung, bạn giữ cho nó cập nhật với thân cây bằng cách kết hợp các thay đổi vào nó tất cả các thời gian, mà làm cho nó dễ dàng hơn để tái tích hợp (hợp nhất trở lại thân cây) khi bạn đã hoàn tất.


Cũng lưu ý, lược đồ versioning tôi đã sử dụng ở đây chỉ là một trong nhiều. Một số nhóm sẽ thực hiện các bản sửa lỗi / bảo trì lỗi như 1.1, 1.2, v.v. và các thay đổi lớn như 1.x, 2.x, v.v. Việc sử dụng ở đây giống nhau, nhưng bạn có thể đặt tên chi nhánh là "1" hoặc "1 .x "thay vì" 1.0 "hoặc" 1.0.x ". (Qua một bên, phiên bản ngữ nghĩa là một hướng dẫn tốt về cách làm số phiên bản).


537
2017-09-20 19:00



Không đúng là trong các thẻ SVN có trọng lượng nhẹ. Trong SVN, các thẻ là một mã xuất đầy đủ và mất mọi tham chiếu đến vị trí trong cây nguồn mà chúng cam. - baruch
@baruch - Điều đó hoàn toàn sai. Các thẻ có trọng lượng nhẹ và (theo như chính Subversion) có liên quan đến các nhánh. - Josh Kelley
Yêu chi tiết trường hợp sử dụng. Cảm ơn @gregmac. - Jeromy French
Tôi có thể nhận được báo giá về nơi thẻ được cho biết là thẻ có trọng lượng nhẹ không? Nó không có vẻ như vậy .. - Cardin
@Cardin Tôi không có tham chiếu ngay bây giờ, nhưng điều quan trọng cần lưu ý là thẻ có trọng lượng nhẹ trên máy chủ nhưng không phải là khách hàng. Nếu bạn kiểm tra tất cả các thẻ, bạn sẽ nhận được nhiều bản sao đầy đủ. Tuy nhiên, nếu bạn nhìn vào kích thước kho lưu trữ trên máy chủ, nó sẽ chỉ tăng một vài byte cho mỗi thẻ. Đây là lý do tại sao bạn không nên kiểm tra thư mục gốc, nói chung. - gregmac


Ngoài những gì Nick đã nói, bạn có thể tìm hiểu thêm tại Streamed Lines: Phân nhánh cho phát triển phần mềm song song

enter image description here

Trong hình này main là thân cây, rel1-maint là một chi nhánh và 1.0 là một thẻ.


92
2017-08-19 13:58



Bạn không nói về Subversion, phải không? - Wolf
@Wolf anh ta có thể là - sơ đồ đó là khá chung chung bất kể dụng cụ. Tất cả các SCM sử dụng các từ khác nhau nhưng cùng khái niệm, không có sự khác biệt giữa thân cây và chính; hoặc thân cây và chủ. Sơ đồ đó cho thấy công ty hiện tại của tôi sử dụng SVN như thế nào. - gbjbaanb
@gbjbaanb Cảm ơn bạn đã chia sẻ. ... và thẻ dường như không được giải quyết bằng câu hỏi. Đó có phải là sự trùng hợp thuần túy (cũng trong công ty hiện tại của bạn) rằng không có sự hợp nhất nào đi từ chính đến các chi nhánh được duy trì? - Wolf
@Wolf Không trùng hợp ngẫu nhiên - chỉ có nhánh từ thân cây, làm việc, hợp nhất lại vào thân cây. Sau đó tách chi nhánh ra thành nhánh thẻ. Chúng tôi đang xem xét một 'thân cây' khác gọi là Tích hợp đã hoàn thành các chi nhánh sáp nhập vào nó để thử nghiệm mà không cấu thành một bản phát hành, thân cây vẫn được sử dụng cho những ngành mà chúng tôi quyết định đưa vào bản phát hành tiếp theo. Thời gian duy nhất bạn hợp nhất từ ​​nhánh này sang nhánh khác là cập nhật nhánh dài, nhưng tốt hơn (và dễ dàng hơn) để tạo nhánh mới ra khỏi nhánh và kết hợp các thay đổi của nhánh cũ với nó nếu bạn cần. - gbjbaanb


Nói chung (công cụ xem thuyết bất khả tri), một chi nhánh là cơ chế được sử dụng để phát triển song song. Một SCM có thể có từ 0 đến n nhánh. Subversion có 0.

  • Thân cây là một chi nhánh chính đề nghị bởi Subversion, nhưng bạn không bị buộc phải tạo ra nó. Bạn có thể gọi nó là 'chính' hoặc 'bản phát hành', hoặc không có cái nào cả!

  • Chi nhánh đại diện cho một nỗ lực phát triển. Nó không bao giờ được đặt tên theo một tài nguyên (như 'vonc_branch') nhưng sau:

    • một mục đích 'myProject_dev' hoặc 'myProject_Merge'
    • chu vi phát hành 'myProjetc1.0_dev'or myProject2.3_Merge' hoặc 'myProject6..2_Patch1' ...
  • Nhãn là ảnh chụp nhanh các tệp để dễ dàng quay lại trạng thái đó. Vấn đề là thẻ và chi nhánh giống nhau trong Subversion. Và tôi chắc chắn sẽ đề nghị cách tiếp cận hoang tưởng:

    bạn có thể sử dụng một trong các tập lệnh kiểm soát truy cập được cung cấp với Subversion để ngăn mọi người làm bất cứ điều gì ngoài việc tạo bản sao mới trong khu vực thẻ.

Thẻ là cuối cùng. Nội dung của nó không bao giờ thay đổi. KHÔNG BAO GIỜ. Không bao giờ. Bạn đã quên một dòng trong ghi chú phát hành? Tạo một thẻ mới. Lỗi thời hoặc xóa cũ.

Bây giờ, tôi đọc rất nhiều về "sáp nhập lại như vậy và như vậy trong các ngành như vậy và như vậy, sau đó cuối cùng trong nhánh thân cây". Cái đó được gọi là hợp nhất quy trình làm việc và có không có gì bắt buộc ở đây. Không phải vì bạn có một nhánh thân cây mà bạn phải hợp nhất trở lại bất cứ điều gì.

Theo quy ước, nhánh trunk có thể đại diện cho trạng thái hiện tại của sự phát triển của bạn, nhưng đó là một dự án tuần tự đơn giản, đó là một dự án có:

  • không phát triển 'trước' (để chuẩn bị phiên bản tiếp theo cho thấy những thay đổi như vậy mà chúng không tương thích với sự phát triển 'thân cây' hiện tại)
  • không tái cấu trúc lớn (để thử nghiệm một lựa chọn kỹ thuật mới)
  • không bảo trì lâu dài cho bản phát hành trước

Bởi vì với một (hoặc tất cả) kịch bản đó, bạn có được bốn 'thân cây', bốn 'phát triển hiện tại', và không phải tất cả những gì bạn làm trong sự phát triển song song đó sẽ nhất thiết phải được hợp nhất lại trong 'thân cây'.


73
2017-08-19 13:25



Xem thêm "Khi nào đến chi nhánh?": stackoverflow.com/questions/2100829#2107672 - VonC


Trong SVN, một thẻ và nhánh thực sự giống nhau.

Nhãn = một lát được xác định trong thời gian, thường được sử dụng cho các bản phát hành

Chi nhánh = cũng là một lát được xác định trong thời gian mà sự phát triển có thể tiếp tục, thường được sử dụng cho các phiên bản chính như 1.0, 1.5, 2.0, vv, sau đó khi bạn nhả bạn gắn thẻ nhánh. Điều này cho phép bạn tiếp tục hỗ trợ một bản phát hành sản xuất trong khi di chuyển về phía trước với những thay đổi đột ngột trong thân cây

Thân cây= không gian làm việc phát triển, đây là nơi tất cả các phát triển sẽ xảy ra, và sau đó thay đổi sáp nhập trở lại từ bản phát hành chi nhánh.


36
2017-08-19 13:27





Họ không thực sự có bất kỳ ý nghĩa chính thức nào. Một thư mục là một thư mục tới SVN. Họ là một cách được chấp nhận chung để tổ chức dự án của bạn.

  • Thân cây là nơi bạn giữ dòng chính của bạn phát triển. Thư mục chi nhánh là nơi bạn có thể tạo, tốt, các nhánh, rất khó giải thích trong một bài viết ngắn.

  • Chi nhánh là một bản sao của một tập con của dự án của bạn mà bạn làm việc riêng biệt với thân cây. Có lẽ đó là cho các thí nghiệm mà có thể không đi bất cứ nơi nào, hoặc có lẽ nó cho phiên bản tiếp theo, mà sau này bạn sẽ hợp nhất trở lại vào thân cây khi nó trở nên ổn định.

  • Và thư mục thẻ là để tạo các bản sao được gắn thẻ của kho lưu trữ của bạn, thường là tại các điểm kiểm tra phát hành.

Nhưng như tôi đã nói, với SVN, một thư mục là một thư mục. branch, trunk và thẻ chỉ là một quy ước.

Tôi đang sử dụng từ 'copy' một cách tự do. SVN không thực sự tạo bản sao đầy đủ của những thứ trong kho.


28
2017-08-19 13:37





Các Thân cây là dòng phát triển chứa mã nguồn và các tính năng mới nhất. Nó sẽ có bản sửa lỗi mới nhất trong đó cũng như các tính năng mới nhất được thêm vào dự án.

Các cành cây thường được sử dụng để làm một cái gì đó đi từ thân cây (hoặc dây chuyền phát triển khác) mà nếu không sẽ phá vỡ tòa nhà. Các tính năng mới thường được xây dựng trong một chi nhánh và sau đó sáp nhập trở lại vào thân cây. Các nhánh thường chứa mã không nhất thiết được phê duyệt cho nhánh phát triển mà nó phân nhánh. Ví dụ, một lập trình viên có thể thử tối ưu hóa một cái gì đó trong một chi nhánh và chỉ hợp nhất trở lại trong dòng phát triển khi tối ưu hóa là thỏa đáng.

Các thẻ là ảnh chụp nhanh của kho lưu trữ tại một thời điểm cụ thể. Không phát triển nên xảy ra trên những. Chúng thường được sử dụng để lấy một bản sao của những gì đã được phát hành cho một khách hàng để bạn có thể dễ dàng có quyền truy cập vào những gì một khách hàng đang sử dụng.

Đây là một liên kết đến một hướng dẫn rất tốt để lưu trữ:

Các bài viết trên Wikipedia cũng đáng đọc.


12
2018-06-30 11:50





Bây giờ đó là điều về phát triển phần mềm, không có kiến ​​thức nhất quán về bất cứ điều gì, mọi người dường như có nó theo cách riêng của họ, nhưng đó là bởi vì nó là một kỷ luật tương đối trẻ anyway.

Đây là cách đơn giản của tôi,

Thân cây - Thư mục thân chứa cơ quan mới nhất, được phê duyệt và hợp nhất của tác phẩm. Trái ngược với những gì nhiều người đã thú nhận, thân cây của tôi chỉ dành cho công việc sạch sẽ, gọn gàng, được phê duyệt, và không phải là một khu vực phát triển, mà là một khu vực phát hành.

Tại một số điểm nhất định trong thời gian khi thân cây dường như đã sẵn sàng để phát hành, thì nó được gắn thẻ và phát hành.

cành cây - Thư mục nhánh chứa các thử nghiệm và công việc đang diễn ra. Làm việc dưới một chi nhánh ở đó cho đến khi được chấp thuận để được sáp nhập vào thân cây. Đối với tôi, đây là khu vực mà tất cả công việc được thực hiện.

Ví dụ: tôi có thể có lặp lại-5 nhánh cho vòng phát triển thứ năm trên sản phẩm, có thể là nguyên mẫu-9 nhánh cho vòng thử nghiệm thứ chín, v.v.

thẻ - Thư mục thẻ chứa ảnh chụp nhanh các bản phát hành nhánh và thân cây đã được phê duyệt. Bất cứ khi nào một chi nhánh được phê duyệt để hợp nhất vào thân cây, hoặc một bản phát hành được tạo thành từ thân cây, một ảnh chụp của nhánh đã được phê duyệt hoặc bản phát hành thân được thực hiện dưới các thẻ.

Tôi cho rằng với các thẻ, tôi có thể nhảy qua lại theo thời gian để thu hút sự quan tâm khá dễ dàng.


10
2017-08-19 13:28