2012-04-16 12 views
171

Mój projekt strutureGit aktualizacja modułem rekurencyjne

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

Jak mogę zaktualizować submodule rekurencyjnego? Próbowałem już kilka poleceń git (na Projecta root)

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

ale nie można wyciągnąć pliki z Gałązka

+0

Jak o [git-deep] (https://github.com/bluejamesbond/git-deep)? – bluejamesbond

Odpowiedz

374
git submodule update --recursive 

Będziesz także prawdopodobnie chcesz użyć opcji --init do co pozwoli zainicjować każdy niezainicjalizowane submoduły:

git submodule update --init --recursive 

Uwaga: w niektórych starszych wersji Git, jeśli używaszOpcja, już zainicjowane submoduły nie mogą być aktualizowane. W takim przypadku należy również uruchomić polecenie bez opcji --init.

+0

Co powiesz na moduł dodatkowy rekursywny? "git submodule add FrameworkA.git" wystarczy przeciągnąć pliki programu FrameworkA. – complez

+1

Możesz po prostu zrobić "git submodule add blah", a następnie "git submodule update --init --recursive". – drewag

+0

Czy to różni się od mojej poniżej? –

18

Sposób używam to:

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

Pracowałem nad zmianą ostatniej linii na: 'git subodule foreach git pull --ff-only origin master'' –

+1

Dodałbym również --recursive do ostatniej linii:" git submodule foreach --recursive git merge origin master "inaczej możesz dostać brudny submoduł, gdy sam zaktualizował moduł. –

+0

Szukałem tego przez ostatnie trzy godziny. Dziękuję Panu. Aby dodać do tego, możesz również użyć tych komend do zatwierdzenia, takich jak: 'git submodule foreach --recursive 'git commit -a | : ". ':' Powoduje, że jest on w pętli bez względu na wynik. Zobacz [link] (https://stackoverflow.com/questions/19728933/continue-looping-over-submodules-with-the-git-submodule-foreach-command-after) https://stackoverflow.com/questions/19728933/continue-over-submodules-with-the-git-submodule-foreach-command-after. –

12

Ponieważ zdarza się, że domyślna oddział firmy submodułów są niemaster (co się często zdarza w moim przypadku), to w jaki sposób zautomatyzować pełny Git submodules uaktualnień:

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

Próbowałem dodać to polecenie w moim [generic Makefile] (https://github.com/Falkor/Makefiles/blob/devel/repo/Makefile), ale nadal utknąłem, aby GNU Make * zignorować * interpretację sekwencja $ (...), pomimo obecności w prostych cytatach. Ktoś ma pomysł? –

+0

Twoje polecenie jest tym, czego potrzebowałem, dziękuję! Ale dostaję: 'Wprowadzanie 'Core' fatal: niejednoznaczny argument" origin/HEAD ": nieznana wersja lub ścieżka nie w drzewie roboczym." Gdzie 'Core' jest modułem podległym – Sanandrea

+0

Przydatne informacje, dziękuję za udostępnienie! –

0

w ostatnich Git (używam v2.15.1) dodaje się połączą upstream zmiany modułem do submodules rekurencyjnie:

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

Możesz dodać --init zainicjować jakiekolwiek niezainicjowane submodules i używać --rebase jeśli chcesz rebase zamiast seryjnej.

Musisz zatwierdzić zmiany potem:

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