Tại tổ chức của tôi, chúng tôi muốn chuyển từ sử dụng CVS sang Mercurial vì nhiều lý do. Chúng tôi đã thực hiện rất nhiều điều tra khi cố gắng xác định cách chúng tôi nên tổ chức kho lưu trữ Hg của mình dựa trên những gì chúng tôi có trong codebase của chúng tôi và cách chúng tôi có xu hướng hoạt động. Chúng tôi đã đưa ra các câu trả lời thỏa đáng cho hầu hết các câu hỏi của chúng tôi, nhưng có một điểm khiến chúng tôi lo lắng một chút và điều đó khiến tôi phát điên vì cách thuận tiện nhất để tổ chức repo cho quy trình làm việc của chúng tôi dường như là một cách sai lầm một quan điểm khái niệm. Tôi đang cố gắng tìm hiểu xem liệu nhận thức của chúng tôi về cách thức này "được cho là" để làm việc là sai, hoặc cho dù chúng ta chỉ chạm vào một khoảng cách tính năng hợp pháp trong công cụ có sẵn.Monolithic vs nhiều Repos Mercurial cho các mô-đun trong một bộ ứng dụng liên quan
Chủ yếu là chúng tôi duy trì một codebase cỡ trung bình bao gồm một bộ ứng dụng nhận được tất cả được phát hành trong cùng một gói. Về mặt lý thuyết bạn có thể chia mã của chúng tôi thành ba loại:
- đang chia sẻ đang
- Đơn xin bộ chính của chúng tôi (sử dụng mã chia sẻ)
- tiện ích nhỏ khác được thường xuyên duy trì (sử dụng mã chia sẻ)
Điều này dường như không bình thường đối với tôi, nhưng tôi muốn nhấn mạnh điểm chúng tôi duy trì mã ứng dụng và mã được chia sẻ cùng một lúc và luôn muốn chúng xuất hiện cạnh nhau. Tức là, chúng tôi muốn tất cả các ứng dụng của chúng tôi xây dựng để luôn sử dụng phiên bản mới nhất và cùng một phiên bản của mã được chia sẻ. Chúng tôi thường xuyên thêm hoặc sửa đổi mã ứng dụng và mã được chia sẻ cùng một lúc. Hiện tại, mã chia sẻ nằm trong một mô-đun CVS và các ứng dụng đều nằm trong các mô-đun riêng biệt của chúng. Mã chia sẻ và các mô-đun ứng dụng được kiểm tra sao cho mã chia sẻ được xây dựng một lần và sau đó được liên kết vào từng ứng dụng. Chúng tôi thường xuyên thực hiện các cam kết cvs bao gồm các thay đổi trên các mô-đun chia sẻ và ứng dụng cùng một lúc. Chúng tôi thực sự muốn giữ khả năng đó.
Tôi hiểu rằng cam kết trong Hg là nguyên tử trong kho - đó là tốt nhưng tôi muốn có thể khác và cam kết với một ứng dụng và thư viện được chia sẻ tại cùng một thời điểm (nghĩa là tôi không quan tâm nếu nó thực sự nguyên tử nhưng tôi không muốn phải tự làm hai khác biệt riêng biệt và hai hành động cam kết riêng biệt).
Về mặt khái niệm, có vẻ như sẽ đúng khi có một hoặc một vài bản repo cho mã được chia sẻ và một repo riêng cho từng ứng dụng và mỗi chương trình tiện ích nhỏ. Điều này có nghĩa là bạn cần phải kiểm tra nhiều bản ghi nhớ cho mỗi bản dựng nhưng đó không phải là vấn đề đối với chúng tôi. Vấn đề là dường như không có bất kỳ công cụ nào cho phép bạn xem các cập nhật hoặc thay đổi trên nhiều repos cùng một lúc, hoặc nhiều repos khác nhau cùng một lúc và sau đó liên tục cam kết chúng cho bạn. Điều này sẽ dễ dàng để kịch bản, nhưng điều đó sẽ không giúp các nhà phát triển, những người muốn sử dụng giao diện đồ họa khác nhau để bổ sung cho dòng lệnh.
Nó có vẻ như để có thể cam kết trên nhiều codebases cùng một lúc (từ quan điểm của người dùng) và giữ cho mọi thứ trên bờ chảy máu với nhau, chỉ có hai giải pháp là:
- Sử dụng một repo nguyên khối với mọi thứ trong đó.
- Tạo một số subrepos nhưng truy cập/cam kết tất cả mọi thứ thông qua một repo "chính" nguyên khối chứa tất cả các subrepos để giữ mọi thứ trên bản sửa đổi mới nhất (có vẻ như không tốt hơn (1) với tôi).
Không thể là điều bất thường khi muốn làm việc với nhiều kho "ngang hàng" cùng một lúc, ngay cả khi các hành động không thực sự nguyên tử trên tất cả chúng - và tôi không tìm thấy tấn bài viết hoặc bài đăng kêu gọi khả năng này.
Nói tóm lại:
- Chúng tôi muốn tổ chức mã của chúng tôi như vậy mà chúng ta có thể diff và cam kết mã ứng dụng và mã chia sẻ cùng lúc từ quan điểm của người dùng (họ không cần phải thực sự được nguyên tử).
- Có vẻ như chúng ta nên đặt mã ứng dụng và mã được chia sẻ trong các kho lưu trữ riêng biệt.
- Cụm phụ đề liên kết kho lưu trữ gốc với các bản sửa đổi cụ thể mà chúng tôi không muốn.
Tôi thiếu gì ở đây?
Lý do của bạn chống lại việc có một kho lưu trữ lớn với mọi thứ trong đó là gì? Nếu tất cả các mã có liên quan và nên được giữ trong đồng bộ với nhau, tại sao không làm điều đó? – jwd
Bạn có thể cho chúng tôi ý tưởng về "kích thước trung bình" không? Có lẽ một kích thước gần đúng của tất cả các tệp nguồn trong bộ phần mềm? Ngoài ra, # 3 trong tóm tắt của bạn là không rõ ràng với tôi: bạn có ý nghĩa gì bởi "tie", và tại sao bạn không muốn nó? –
Đối số hấp dẫn nhất của tôi đối với việc có một kho lưu trữ lớn với mọi thứ trong đó là nếu chúng ta muốn chia sẻ mã với các phòng ban khác thông qua kho lưu trữ, chúng tôi phải cấp cho họ quyền truy cập vào tất cả mã. Không nhất thiết phải là một máy cắt giao dịch nhưng không tuyệt vời. – rationull