Làm thế nào để thiết lập một dự án git để sử dụng một mô hình con repo bên ngoài?


213

Tôi muốn tạo một repo kéo theo một repo từ xa.

Ví dụ: giả sử jQuery là một mô hình con:

git://github.com/jquery/jquery.git

Điều gì sẽ là quá trình tạo một repo với jQuery như là một mô hình con và thêm bên ngoài của riêng tôi như một repo từ xa.

Ngoài ra một khi điều này được thiết lập, nếu tôi đẩy / kéo đến điều khiển từ xa của riêng tôi, liệu bên ngoài có còn nguyên vẹn không?


1
Khi bạn nói "pull in", bạn có nói rằng bạn muốn repo jQuery là một mô hình con của repo của riêng bạn không?
ezod

Có chính xác, xin lỗi nếu điều đó không rõ ràng. Tôi muốn biết làm thế nào tôi thiết lập nó như một thiết bị bên ngoài trong khi đẩy và kéo các thay đổi vào điều khiển từ xa của riêng tôi
Tom

Xem Hướng dẫn mô hình con Git trên wiki git.
Greg Bacon

Câu trả lời:


343
  1. Bạn có một dự án - gọi nó là MyWebApp đã có repo github
  2. Bạn muốn sử dụng kho lưu trữ jquery trong dự án của bạn
  3. Bạn muốn kéo repo jquery vào dự án của bạn như là một mô hình con .

Submodules thực sự, thực sự dễ dàng để tham khảo và sử dụng. Giả sử bạn đã cài đặt MyWebApp làm repo, từ thiết bị đầu cuối phát hành các lệnh này:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Điều này sẽ tạo một thư mục có tên externals/jquery* và liên kết nó với kho lưu trữ github jquery. Bây giờ chúng ta chỉ cần khởi tạo mô hình con và sao chép mã vào nó:

git submodule update --init --recursive

Bây giờ bạn sẽ có tất cả các mã mới nhất được nhân bản vào mô hình con. Nếu repo jquery thay đổi và bạn muốn kéo mã mới nhất xuống, chỉ cần phát lại submodule updatelệnh. Xin lưu ý: Tôi thường có một số kho lưu trữ bên ngoài trong các dự án của mình, vì vậy tôi luôn nhóm các repos trong một thư mục "externals".

Sách Pro Git trực tuyến có một số thông tin tốt về các mô hình con (và git nói chung) được trình bày theo cách dễ đọc. Thay phiên, git help submodulecũng sẽ cung cấp thông tin tốt. Hoặc hãy xem Hướng dẫn mô hình con Git trên wiki git.

Tôi nhận thấy mục blog này nói về các mô hình con và so sánh chúng với cơ chế svn: externals của Subversion: http://speirs.org/blog/2009/5/11/under Hiểu-git-submodules.html

* Là một cách thực hành tốt nhất, bạn nên luôn đặt các mô hình con của mình trong thư mục riêng của chúng, chẳng hạn như Externals. Nếu bạn không, thư mục dự án gốc của bạn có thể trở nên rất lộn xộn rất nhanh.


4
Giải thích tuyệt vời! :) Ngoài ra, "git help subodules" sẽ giúp nếu bạn muốn biết thêm một chút chi tiết, nội bộ, v.v.
WhyNotHugo

2
Cảm ơn, chính xác những gì tôi cần.
MikeSchinkel

1
@Chevi Nó phụ thuộc vào yêu cầu của bạn. Nói chung, việc thêm một dự án git làm mô hình con cho dự án của bạn là một giải pháp tốt cho các dự án thay đổi thường xuyên hoặc vẫn đang được phát triển. Điều này cho phép bạn dễ dàng đảm bảo rằng tất cả mã bên thứ 3 trong dự án của bạn được cập nhật. Đối với mã bên thứ 3 về cơ bản là mã tĩnh - ổn định, mã trưởng thành có thể sẽ không thay đổi nhiều từ phiên bản này sang phiên bản khác - sử dụng mô hình con không cung cấp nhiều giá trị.
memmons

2
xin lỗi nhưng so với bên ngoài svn, điều đó không dễ dàng gì
Keil

2
@Keil Đó là hai lệnh git submodule addgit submodule update... Tôi không chắc nó có thể dễ dàng hơn bao nhiêu.
memmons

24

Hầu hết những gì bạn cần biết đã được trả lời, vì vậy tôi sẽ không bận tâm đến việc đó, tuy nhiên, tôi đã tìm thấy một mẩu thông tin nhỏ thường bị thiếu.

Như bạn đã biết, "git pull" sẽ không cập nhật các mô hình con và "cập nhật mô hình con git" cũng sẽ không tải xuống TRƯỚC mới nhất của các mô hình con đó.

Để cập nhật tất cả các mô hình con của bạn lên phiên bản ngược dòng mới nhất của chúng, bạn có thể sử dụng

git submodule foreach git pull

Nếu bạn thường xuyên thay đổi các mô hình con của mình và có rất nhiều, thì "git foreach" sẽ trở nên vô giá.



0

Tôi nghĩ rằng câu trả lời @Hugo có thể là những gì bạn cần và hoạt động tốt. Vì vậy, tôi đã tìm thấy một cách dễ dàng hơn.

git submodule update --remote

Đó là tất cả.

Vì vậy, một quy trình công việc hoàn chỉnh có thể là:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
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.