2010-01-21 4 views
7

Tôi là một người dùng Subversion, và tôi nghĩ rằng tôi đã có chủ yếu của tôi xung quanh nó tất cả bây giờ. Vì vậy, tất nhiên bây giờ chúng tôi đang nghĩ đến việc chuyển sang Mercurial, và tôi cần phải bắt đầu lại.Suy ngẫm của người dùng Subversion: "Chi nhánh" trong thuật ngữ Mercurial là gì?

Trong kho lưu trữ duy nhất của chúng tôi, chúng tôi có bố cục branches, tags, trunk điển hình. Khi tôi muốn tạo chi nhánh tính năng I:

  • Sử dụng trình duyệt kho để sao chép trunk đến branches/Features/[FeatureName].
  • Thanh toán bản sao làm việc mới từ branches/Features/[FeatureName].
  • Bắt đầu làm việc trên đó.
  • Thỉnh thoảng cam kết, hợp nhất trunk trong, giải quyết xung đột và cam kết.
  • Khi hoàn tất, thêm một lần hợp nhất là trunk, sau đó "Tích hợp lại" nhánh chi tiết thành thân cây.

(Xin lưu ý quá trình này được đơn giản hóa vì không tính đến các chi nhánh ứng viên giải phóng tài khoản, v.v.).

Vì vậy, tôi có thắc mắc về cách tôi muốn thực hiện các yêu cầu tương tự (ví dụ các ngành chức năng chứ không phải là làm việc trên thân cây) trong Mercurial:

  • Trong Mercurial, là một chi nhánh vẫn còn trong kho, hoặc là nó là một kho lưu trữ cục bộ hoàn toàn mới?
  • Nếu chúng ta có một bản sao của toàn bộ kho lưu trữ, điều đó có nghĩa là tất cả chúng ta đều có bản sao của các chi nhánh khác nhau của nhau (đó là rất nhiều dữ liệu chuyển giao)?
  • Tôi biết Mercurial là DCVS, nhưng điều đó có nghĩa là chúng tôi đẩy/kéo các thay đổi trực tiếp, thay vì thông qua kho lưu trữ ngang hàng trên máy chủ?

Trả lời

7

Trong Mercurial, là một chi nhánh vẫn trong vòng kho, hoặc là nó một hoàn toàn mới kho địa phương?

Tương đương với cách làm việc lật đổ sẽ là kho lưu trữ với multiple heads trong thủy ngân. Tuy nhiên, đây không phải là cách làm việc thành ngữ. Thông thường, bạn sẽ chỉ có một đầu trong một kho lưu trữ nhất định, vì vậy các kho lưu trữ riêng biệt cho mỗi nhánh.

Nếu mỗi chúng ta có một bản sao của toàn bộ kho , điều đó có nghĩa là tất cả chúng ta có bản sao của nhau nhiều tính năng chi nhánh (đó là rất nhiều dữ liệu chuyển)?

Có, nếu bạn nhìn vào lịch sử của người đứng đầu kho lưu trữ cục bộ, bạn sẽ có thể thấy tất cả các chi nhánh được hợp nhất. Ví dụ, tôi đã thực hiện một số hg clone https://www.mercurial-scm.org/repo/hg để lấy nguồn cho chính nó, và chỉ 34,3 MB trên một hệ thống tệp NTFS (so với source code download, là 1,8 MB). Mercurial cũng sẽ sử dụng các liên kết cứng nếu hệ thống tệp của bạn hỗ trợ nó, vì vậy có rất ít chi phí nếu bạn sao chép một kho lưu trữ đến một vị trí khác trên cùng một đĩa.

Tôi biết Mercurial là một DCVS, nhưng đó có nghĩa là chúng ta đẩy những thay đổi/pull từ nhau trực tiếp, chứ không phải thông qua một kho ngang trên một máy chủ?

Một cách làm việc thực sự là có mỗi nhà phát triển trưng ra một kho lưu trữ công cộng, trong đó ông đẩy các thay đổi của riêng mình. Tất cả các nhà phát triển khác sau đó có thể kéo những gì họ muốn.

Tuy nhiên, thông thường, bạn sẽ có một hoặc nhiều kho "may mắn" nơi tất cả các thay đổi được tích hợp. Tất cả các nhà phát triển sau đó chỉ cần kéo từ kho chứa may mắn. Ngay cả khi bạn không rõ ràng có một kho chứa may mắn như vậy tôi tưởng tượng mọi người sẽ tự động tổ chức mình như thế, ví dụ: bằng cách kéo từ một nhà phát triển chính.

+0

Người ta có thể điều chỉnh quy trình làm việc phân cấp từ tài liệu Bazaar: http://doc.bazaar.canonical.com/bzr.1.18/en/user-guide/index.html#decentralized-with-shared-mainline –

+0

Nhưng nếu đó là repo riêng biệt cho mỗi chi nhánh, và mỗi repo chỉ nên có một đầu, sau đó "kho lưu trữ tính năng" đi đâu khi bạn muốn đặt chúng ở đâu đó an toàn? Làm thế nào để bạn có được những thay đổi tính năng vào "repo may mắn"? –

+0

@Neil: một dịch vụ lưu trữ siêu việt như mã google thường sẽ có cách để tạo nhanh các chi nhánh mới một cách nhanh chóng và dễ dàng, vì vậy bạn có thể đặt các thay đổi thử nghiệm của mình "ở đâu đó an toàn". –

9

tôi khuyên bạn nên đọc hướng dẫn bài viết này http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial//

+0

+1 Tôi đặc biệt thích mẹo về cách tránh chi phí sao chép từng kho nhánh riêng biệt qua kết nối Internet –

+1

Chắc chắn là một hướng dẫn tốt, nhưng chỉ là một liên kết và không có câu trả lời trực tiếp cho bất kỳ câu hỏi nào được nêu ra. +0 –

5

Steve Losh về nhánh trong lanh lợi liên kết ở trên là tuyệt vời. Tôi cũng đã đi vào một số giải thích về phân nhánh và cách DAG hoạt động trong a presentation I gave a couple of months ago on mercurial that's out on slideshare. Các slide thích hợp bắt đầu từ slide # 43.

Tôi nghĩ rằng sự hiểu biết rằng tất cả các cam kết vào cùng một kho lưu trữ được lưu trữ trong DAG (Đồ thị theo chu kỳ) với một số quy tắc đơn giản thực sự giúp làm sáng tỏ những gì đang diễn ra.

  • một nút không có nút con là một "đầu"
  • nút gốc không có cha mẹ
  • nút thường xuyên có một người mẹ độc thân
  • nút đó là kết quả của việc kết hợp với có hai cha mẹ
  • nếu cha mẹ của nút hợp nhất từ ​​các chi nhánh khác nhau, chi nhánh của nút con được thừa hưởng từ bậc cha mẹ đầu tiên

Các chi nhánh được đặt tên thực sự chỉ là m nhãn etadata trên cam kết, nhưng thực sự không khác gì so với các nhánh ẩn danh xảy ra khi bạn hợp nhất một người nào đó làm việc trong kho lưu trữ của bạn hoặc nếu bạn quay lại phiên bản cũ hơn và sau đó thực hiện cam kết ở đó để tạo đầu mới (sau đó bạn có thể hợp nhất).

+2

+1 cảm ơn bạn đã chia sẻ trang trình bày của mình. Điều duy nhất tôi nghĩ là thiếu là một đề cập đến 'cấy ghép hg'. Hầu hết các hợp nhất svn của tôi là các cổng back-bug của các sửa lỗi cho các nhánh bảo trì, và các phép trộn như vậy không thực sự tương đương với 'hg merge'. –