Nhóm nhiều kho Git là một phần của cùng một dự án


14

Giả sử tôi có một dự án có nhiều thành phần: thành phần máy chủ, thành phần ứng dụng web, thành phần iOS, thành phần Android, v.v. Các thành phần này đều là các cơ sở mã riêng biệt, nhưng cũng được ghép lỏng lẻo (ví dụ: thay đổi máy chủ mã có thể yêu cầu thay đổi tất cả các thành phần khác nữa)

Cách hiệu quả nhất trong Git để tổ chức dự án này là gì? Nếu bạn đặt tất cả trong một kho lưu trữ, bạn sẽ luôn có các phiên bản mới nhất nhưng mọi thứ trở nên khá lộn xộn khi bạn bắt đầu thay đổi một thành phần chứ không phải các thành phần khác.

Mặt khác, nếu bạn tạo mỗi thành phần thành một kho lưu trữ riêng biệt, làm thế nào bạn có thể "liên kết" các kho lưu trữ này để bạn biết rằng phiên bản 2.0 của ứng dụng yêu cầu phiên bản 1.5 của thành phần máy chủ, v.v?

Có một tính năng nào trong git ngoài việc cập nhật readmes (hoặc một số giải pháp tốt hơn mà tôi không thấy) để quản lý hiệu quả hơn nhiều repos liên quan?


Các thành phần này có thực sự phụ thuộc vào nhau, giống như mối quan hệ giữa thành phần đáng tin cậy và thư viện không? Hay bạn chỉ đang cố gắng giữ cho tất cả các thành phần đáng tin cậy của bạn đồng bộ?
Vô dụng

Đây là một cuộc thảo luận cũ hơn về StackOverflow (kỳ diệu chưa được đóng lại).
Dan Dascalescu

Câu trả lời:


6

Các tiểu dự án là nơi các hệ thống kiểm soát phiên bản phân tán (DVCS) bắt đầu, nếu không làm sáng tỏ, chắc chắn sẽ trở thành một chút rắc rối.

Git submodules và Mercurial subrepositories mục tiêu cho cả hỗ trợ tiểu dự án. Cả hai đều được cải thiện bản phát hành (đến mức "tính năng này tồn tại cũ của Mercurial, nhưng có lẽ bạn không nên sử dụng nó" cảnh báo không còn ở phía trước và trung tâm nữa.)

Tuy nhiên, repos đa dự án vẫn là một trường hợp sử dụng đặc biệt hơn là một tính năng mọi người sử dụng. Tài liệu này chứa nhiều cảnh báo và "cách sử dụng" hướng dẫn này cho thấy rõ rằng việc quản lý "dự án của dự án" là mối quan tâm hai cấp, với quản lý meta hơi khác nhưng thực sự khác với quản lý dự án trực tiếp, đơn cấp. Kết quả là, có rất ít kinh nghiệm ngoài kia. Và không thiếu "không sử dụng mô đun con git!" và "tránh sự thay thế đồng bóng!" bình luận và bài viết trên blog.

Kinh nghiệm của riêng tôi với subrepose đã được trộn lẫn. Nó đã làm việc ... nhưng nó cũng gây phiền nhiễu. Tôi thích ý tưởng của các dự án phụ, nhưng trong thực tế, hãy tìm các giải pháp thay thế - hoặc là các dự án lớn tất cả trong một hoặc các dự án anh chị em đồng hành - để dễ dàng bị xáo trộn hơn (mặc dù kém thanh lịch hơn). Tôi mong muốn ngày thay thế là chủ đạo và không phải là một nỗi đau, nhưng tôi chưa trải nghiệm điều đó.

Điều này không có nghĩa là việc quản lý các mô hình con / subrepose sẽ không hiệu quả với bạn, nhưng đó là điều cần được thực hiện cẩn thận, và chắc chắn là một số thử nghiệm và lập kế hoạch trước đó.

Cho rằng bạn đang tập trung vào Git, bạn cũng nên khám phá các cây con Git, một số thứ được coi là sự thay thế tốt hơn cho các mô đun con git .


1
Xem lại vào năm 2016: Tài liệu Hg vẫn gọi subrepose là một tính năng của phương sách cuối cùng . Tài liệu Git nhiệt tình hơn, và tính năng mô đun con của nó giờ được tích hợp nhiều hơn. Bây giờ cả hai cũng xử lý tốt các repos lồng nhau (nhận ra repo lồng nhau "có bóng" với các tệp mà nó đang quản lý), đưa ra một tùy chọn repo phụ hữu ích khác. Nhưng các công cụ DVCS vẫn chủ yếu trên các repos một cấp, vì vậy các cảnh báo "sub-repos => nhiều cấp quản lý" và "rồng ở đây" vẫn có liên quan.
Jonathan Eunice

2

Nếu bạn sử dụng C #, bạn có thể sử dụng NuGet.

Làm cho mỗi thành phần là một thư viện và giữ chúng trong kho lưu trữ của riêng họ. Thực hiện phát hành các thành phần cơ bản mà bạn phiên bản theo phiên bản ngữ nghĩa.

Cuối cùng, hãy lấy máy chủ xây dựng của bạn để đóng gói các thư viện vào các gói NuGet và sử dụng các gói NuGet đó trong các dự án cho các thành phần ngoại vi (iOS, Android).

Cách tiếp cận cơ bản tương tự (phiên bản và phụ thuộc gói) cũng có thể được sử dụng trong các ngôn ngữ khác, nhưng có thể không thuận tiện.

Tôi không khuyên bạn nên sử dụng Submodules Git. Mặc dù nó có thể được sử dụng cho các loại vấn đề này trong lý thuyết, tôi cảm thấy nó là một rắc rối lớn hơn giá trị của nó.


2

Theo tôi, điều này sẽ phụ thuộc vào mức độ chúng thực sự được ghép nối. Thật là tốt khi có thể chạy tự động git bisectkhi theo dõi hồi quy, nhưng điều này sẽ khó thực hiện nếu mọi cam kết phụ thuộc vào một phiên bản khác nhau của các phụ thuộc khác của bạn để chạy.

Hai tùy chọn có thể là một kho lưu trữ với các mô hình con hoặc nhiều kho lưu trữ với các thực tiễn phiên bản tốt tại chỗ.

Làm thế nào bạn có thể "liên kết" các kho lưu trữ này để bạn biết rằng phiên bản 2.0 của ứng dụng yêu cầu phiên bản 1.5 của thành phần máy chủ, v.v?

Đây thường là miền của một số khung quản lý phụ thuộc (ví dụ Gradle, Maven), chứ không phải Git.

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.