2011-01-15 34 views
7

Tôi mới sử dụng các mô-đun con git và tôi nhận thấy chúng luôn đề cập đến các cam kết cụ thể.Mô-đun con Git trên máy chủ

Có cách nào để môđun con của siêu dự án luôn tham chiếu đến phần đầu của nhánh chính, vì vậy "git submodule update" hoặc "git pull" trong superproject chỉ đơn giản là "git pull" trên tất cả các mô-đun con.

Cảm ơn.

+0

http://gitref.org/ trang Tham chiếu Git là một cách hay để bắt đầu nếu bạn mới sử dụng git. –

+1

@ Aaher: Đây là một câu hỏi rất cụ thể, không chỉ là một câu nói chung "Tôi mới đến git". – Cascabel

+0

Tôi nghĩ câu trả lời là không. Git lưu trữ tên cam kết khi nó ghi lại thông tin của môđun con, và trong trường hợp của tôi, tôi đã viết một tập lệnh để kéo, thêm, cam kết và đẩy nó thực hiện chính xác những gì tôi muốn nó làm với các mô-đun con. – sinelaw

Trả lời

11

Câu trả lời ngắn gọn là không. Ý tưởng là bạn biết chắc chắn một cam kết cụ thể của mô-đun con sẽ làm việc với dự án của bạn, và bạn không muốn bất kỳ hành vi không xác định hoặc bất ngờ đến bằng cách nhận được cập nhật trực tiếp. Một môđun con được biểu thị trực tiếp bởi hai thứ: một mục nhập trong các tệp .gitmodules và một gitlink, là một tham chiếu đến SHA1 của cam kết mong muốn của mô-đun con. SHA1, không đổi tên.

Điều bạn đang yêu cầu thực sự dành cho siêu dự án là có không có ý tưởng nội dung nào trong mô hình con. Hãy suy nghĩ về nó: các bản sao khác nhau của dự án của bạn có thể đã cập nhật submodule vào các thời điểm khác nhau, và kết thúc với các phiên bản khác nhau ở đó, và sau đó nếu commit được thực hiện trong dự án của bạn, họ phải ghi lại các commit khác nhau trong submodule. Khi bạn sáp nhập, bạn có thể chỉ cần bỏ qua những gì họ nói và kéo một lần nữa, có lẽ. Upshot là yêu cầu của bạn là tránh toàn bộ ý tưởng của submodules: để biết những gì bạn có. Nếu bạn nói rằng bạn đang sử dụng "chủ", bạn sẽ quay lại hai tháng kể từ bây giờ và không có ý tưởng đó có nghĩa là gì!

Nếu bạn muốn luôn nhận được nhánh chính hiện tại, bạn nên tự mình thực hiện nó. Viết một kịch bản để kéo tất cả các mô-đun con, và chạy nó ngay bây giờ và sau đó, cam kết các phiên bản cập nhật. (Kiểm tra đầu tiên, mặc dù!) Các điểm ở đây là với submodules, cho mỗi cam kết siêu dự án, bạn phải biết chính xác những gì phiên bản của tiểu dự án bạn đang sử dụng. Đó là lựa chọn của bạn bao lâu bạn muốn cập nhật phiên bản của mô-đun con; nó có thể được hàng ngày nếu bạn thích.

Cách khác là thêm (các) thư mục cho mô-đun con vào gitignore của bạn và viết một kịch bản lệnh nhanh để cập nhật chúng (và có lẽ một bản sao để sao chép chúng). Điều này sẽ khiến bạn mất khả năng biết bạn đã có phiên bản nào tại một thời điểm nào đó trong quá khứ.

+0

Đặt ngay, như mọi khi. +1 – VonC

+0

Cảm ơn rất rõ ràng - thời gian để có được các kỹ năng kịch bản .. – Sam

+1

@ Jefromi: Có lẽ bạn có thể cập nhật câu trả lời của bạn vì nó có thể trong git bây giờ? Xem câu trả lời của VonC. – Onur

10

Cập nhật năm 2013, kể từ khi git 1.8.2, một submodule có thể làm theo một nhánh (và không chỉ tham khảo một cố định cam kết)

Xem "git submodule tracking latest".


(Original câu trả lời Tháng Một 2011)

Đó là một trong những differences between git submodules and (for instance) svn:externals.

Một môđun con được coi là tập hợp các tệp với vòng đời khác nhau, từ đó bạn chọn một cam kết cụ thể để làm việc trên dự án của riêng bạn (repo gốc).
Nếu submodule đó xuất bản cam kết mới, bạn không cần phải làm gián đoạn mọi thứ, bởi vì đột nhiên dự án của bạn không biên dịch nữa vì các diễn biến mới nhất của submodule đã nói.

Nếu, mặt khác, hai tập hợp có liên quan chặt chẽ đến việc sửa đổi bất kỳ thứ gì trong một có nghĩa là cập nhật khác, thì chúng thực sự là một phần của * một repo.

Các vấn đề liên quan