Làm thế nào tôi có thể có các phụ thuộc được liên kết trong một repo git?


148

Trong các tập lệnh của tôi, tôi thường sử dụng các thư viện (của tôi hoặc của người khác) có repos riêng. Tôi không muốn sao chép chúng trong repo của mình và bị mắc kẹt với việc cập nhật chúng mỗi khi có phiên bản mới. Tuy nhiên, khi ai đó nhân bản repo, nó vẫn hoạt động cục bộ và không bị hỏng liên kết.

Bất cứ ý tưởng về những gì tôi có thể làm?

Câu trả lời:


211

Bạn có thể làm điều này với các mô đun con trong git. Trong kho lưu trữ của bạn, làm:

git submodule add path_to_repo path_where_you_want_it

Vì vậy, nếu kho lưu trữ của thư viện có URL git://github.com/example/some_lib.gitvà bạn muốn có nó lib/some_libtrong dự án của mình, bạn sẽ nhập:

git submodule add git://github.com/example/some_lib.git lib/some_lib

Lưu ý rằng điều này cần phải được thực hiện từ thư mục cấp cao nhất trong kho lưu trữ của bạn. Vì vậy, đừng cdvào thư mục nơi bạn đặt nó đầu tiên.

Sau khi bạn thêm một mô hình con hoặc bất cứ khi nào ai đó thực hiện kiểm tra mới kho lưu trữ của bạn, bạn sẽ cần phải làm:

git submodule init
git submodule update

Và sau đó, tất cả các mô hình con bạn đã thêm sẽ được kiểm tra tại cùng một phiên bản bạn có.

Khi bạn muốn cập nhật lên phiên bản mới hơn của một trong các thư viện, hãy cdvào mô hình con và kéo:

cd lib/some_lib
git pull

Sau đó, khi bạn làm một git statusbạn sẽ thấy lib/somelibđược liệt kê trong phần sửa đổi. Thêm tệp đó, cam kết và bạn được cập nhật. Khi cộng tác viên kéo cam kết đó vào kho lưu trữ của họ, họ sẽ thấy lib/somelibđược sửa đổi cho đến khi họ chạy git submodule updatelại.


2
Cảm ơn câu trả lời của bạn, nâng cao! (và có thể sẽ chấp nhận nó vào ngày mai) Có cách nào để chỉ thêm một tệp từ repo khác làm phụ thuộc không? Hay nó phải là một toàn bộ thư mục?
Lea Verou

2
Nếu bạn muốn theo dõi nó như một mô hình con (và do đó, có thể dễ dàng cập nhật các bản cập nhật), bạn sẽ phải lấy toàn bộ kho lưu trữ. Không giống như nhiều VCS khác, git thực sự chỉ muốn đối phó với kho lưu trữ cấp cao nhất.
Emily

7
đọc phần này để biết mô hình con nào tốt và cách giải quyết các vấn đề tiềm ẩn. và một cuộc thảo luận về nó .
minghua

1
giả sử bạn nhập dưới dạng mô hình con khác mà bạn sở hữu. Bạn có thể thay đổi repo ban đầu thông qua các thay đổi cục bộ của bạn trong mô hình con không? Hãy nói rằng bạn đã tìm thấy một lỗi và cần cập nhật bản gốc?
andrevenancio

3
Tôi biết đây là một câu trả lời cũ, nhưng các mô đun con git có thể được cập nhật bằng cách git submodule update --remotetôi khuyên bạn nên sử dụng nhiều cờ hơn cho các dự án phức tạp hơn. Tôi sử dụnggit submodule update --remote --recursive --init
Chris
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.