Đệ trình cập nhật Git đệ quy


282

Dự án của tôi

ProjectA
-FrameworkA (submodule)
--Twig (submodule of FrameworkA)

Làm thế nào tôi có thể cập nhật các mô đun con đệ quy? Tôi đã thử một số lệnh git (trên ProjectA root)

git submodule foreach git pull origin master

hoặc là

git submodule foreach --recursive git pull origin master

nhưng không thể kéo tập tin của Twig.


Làm thế nào về git-sâu ?
Mathew Kurian

Câu trả lời:


607
git submodule update --recursive

Bạn cũng có thể muốn sử dụng tùy chọn --init, điều này sẽ khiến nó khởi tạo bất kỳ mô hình con chưa được khởi tạo nào:

git submodule update --init --recursive

Lưu ý: trong một số phiên bản cũ hơn của Git , nếu bạn sử dụng --inittùy chọn, các mô hình con đã được khởi tạo có thể không được cập nhật. Trong trường hợp đó, bạn cũng nên chạy lệnh mà không có --inittùy chọn.


1
Làm thế nào về đệ quy thêm mô hình con? "Git subodule add FrameworkA.git" chỉ cần kéo các tệp của FrameworkA.
complez

2
Bạn chỉ có thể thực hiện "git subodule add blah" và sau đó "git subodule update --init --recursive".
drewag

Đây có phải là khác nhau theo cách của tôi dưới đây?
William Entriken

3
@Irineau Lưu ý về các mô đun con đã khởi tạo không được cập nhật nếu --initđược sử dụng không phù hợp với trải nghiệm của tôi trên Git 2.2.2. Tôi thấy cả các mô hình con cấp cao nhất và lồng nhau đã được khởi tạo đã nhận được xác nhận chính xác khi tôi sử dụng git submodule update --init --recursivevà tôi nghĩ rằng yêu cầu mà bạn cần chạy lệnh có và không --initđơn giản là sai. Trừ khi ai đó có thể đưa ra bằng chứng rằng đây là hành vi hoặc chứng minh rằng nó đã thay đổi giữa các phiên bản và đã từng là sự thật, tôi dự định sẽ chỉnh sửa nó hoàn toàn.
Đánh dấu Amery

3
@MarkAmery, tôi nhớ đây là một vấn đề trong một số phiên bản git mà tôi không thể nhớ. Tôi mới thử nó trong 1.9.3 và vấn đề dường như không còn tồn tại nữa. Tôi đã cập nhật câu trả lời để chỉ một "phiên bản cũ" mơ hồ. Nếu bất cứ ai có thể chỉ định phiên bản nào đã thay đổi hành vi này, điều đó sẽ rất tuyệt.
vẽ

35

Cách tôi sử dụng là:

git submodule update --init --recursive
git submodule foreach --recursive git fetch
git submodule foreach git merge origin master

6
Tôi đã làm việc với việc thay đổi dòng cuối cùng thành:git submodule foreach git pull --ff-only origin master
Gilad Peleg

2
Tôi cũng sẽ thêm --recursive vào dòng cuối cùng: "git subodule foreach --recursive git merge master master" nếu không bạn có thể nhận được một mô hình con bẩn khi chính nó đã cập nhật một mô hình con.
Michael Scott Cuthbert

Đã tìm kiếm điều này trong ba giờ qua. Cảm ơn ngài. Để thêm vào điều này, bạn cũng có thể sử dụng các lệnh này để cam kết, chẳng hạn như : git submodule foreach --recursive 'git commit -a | :'. Việc :làm cho nó lặp bất kể kết quả. Xem liên kết stackoverflow.com/questions/19728933/ .
Pidgeon non nớt

17

Vì có thể xảy ra rằng nhánh mặc định của các mô hình con của bạn không master (điều này xảy ra rất nhiều trong trường hợp của tôi), đây là cách tôi tự động nâng cấp các mô hình con Git đầy đủ:

git submodule init
git submodule update
git submodule foreach 'git fetch origin; git checkout $(git rev-parse --abbrev-ref HEAD); git reset --hard origin/$(git rev-parse --abbrev-ref HEAD); git submodule update --recursive; git clean -dfx'

Tôi đã cố gắng thêm lệnh này vào Makefile chung của mình nhưng tôi vẫn bị mắc kẹt để làm cho GNU Make bỏ qua việc giải thích chuỗi $ (...), mặc dù nó có trong các trích dẫn đơn giản. Bất cứ ai có một ý tưởng?
Sebastien Varrette

Lệnh của bạn là những gì tôi cần cảm ơn bạn! Nhưng tôi nhận được: Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.nơi Core là submodule
Sanandrea

Ngoài ra, tôi đoán bạn cần phải tìm ra bình luận này stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi

không có tùy chọn đệ quy có nghĩa là điều này chỉ hoạt động nếu các mô hình con của bạn không bao gồm các mô hình con một lần nữa.
erikbwork

15

Trong Git gần đây (tôi đang sử dụng v2.15.1), phần sau đây sẽ hợp nhất các thay đổi mô hình con ngược dòng vào các mô hình con theo cách đệ quy:

git submodule update --recursive --remote --merge

Bạn có thể thêm --initđể khởi tạo bất kỳ mô hình con chưa được khởi tạo nào và sử dụng --rebasenếu bạn muốn rebase thay vì hợp nhất.

Bạn cần phải thực hiện các thay đổi sau đó:

git add . && git commit -m 'Update submodules to latest revisions'

Điều này, tôi nghĩ rằng tôi đã làm điều gì đó sai nhưng câu trả lời của bạn đã xác nhận với tôi rằng nó cũng git submodule update --remote my-dir/my-submodulehoạt động tốt
iomv
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.