2012-04-16 42 views
171

Dự án của tôi Cơ cấuGit cập nhật submodule đệ quy

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

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

git submodule foreach git pull origin master 
or 
git submodule foreach --recursive git pull origin master 

nhưng không thể kéo file của cành

+0

Làm thế nào về [git sâu] (https://github.com/bluejamesbond/git-deep)? – bluejamesbond

Trả lời

374
git submodule update --recursive 

Bạn cũng sẽ có thể muốn sử dụng tùy chọn --init mà sẽ làm cho nó khởi tạo bất kỳ submodules uninitialized:

git submodule update --init --recursive 

Lưu ý: trong một số phiên bản cũ của Git, nếu bạn sử dụngTùy chọn, các mô-đun 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ần --init.

+0

Làm thế nào về đệ quy thêm submodule? "git submodule thêm FrameworkA.git" chỉ cần kéo các tệp của FrameworkA. – complez

+1

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

+0

Điều này khác với cách của tôi dưới đây? –

18

Con đường tôi sử dụng là:

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

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' –

+1

Tôi cũng sẽ thêm --recursive vào dòng cuối cùng:" git submodule foreach --recitive git merge origin master "nếu không bạn có thể nhận được một submodule bẩn khi bản thân nó đã cập nhật một submodule. –

+0

Bạn đang 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 | : ''. Các ':' làm cho nó vòng lặp bất kể kết quả. Xem [link] (https://stackoverflow.com/questions/19728933/continue-looping-over-submodules-with-the-git-submodule-foreach-command-after) https://stackoverflow.com/questions/19728933/tiếp tục loop-over-submodules-với-the-git-submodule-foreach-command-after. –

12

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

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' 
+0

Tôi đã cố gắng thêm lệnh này vào [Makefile chung] của tôi (https://github.com/Falkor/Makefiles/blob/devel/repo/Makefile) nhưng tôi vẫn bị mắc kẹt để làm cho GNU Make * bỏ qua * giải thích trình tự $ (...), mặc dù có sự hiện diện trong dấu nháy đơn giản. Có ai có ý tưởng không? –

+0

Lệnh của bạn là điều tôi cần cảm ơn! Nhưng tôi nhận được: 'Nhập 'Lõi' gây tử vong: đối số mơ hồ 'origin/HEAD': không biết sửa đổi hoặc đường dẫn không có trong cây đang hoạt động.' trong đó' Core' là submodule – Sanandrea

+0

Thông tin hữu ích, cảm ơn bạn đã chia sẻ! –

0

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

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

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

Bạn cần phải cam kết những thay đổi sau:

git add . && git commit -m 'Update submodules to latest revisions' 
Các vấn đề liên quan