Rekurencyjnie podmoduły Git update


284

Mój projekt

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

Jak mogę aktualizować submoduły rekurencyjnie? Próbowałem już niektórych poleceń git (na ProjectA root)

git submodule foreach git pull origin master

lub

git submodule foreach --recursive git pull origin master

ale nie można pobrać plików Twig.


Co powiesz na git-deep ?
Mathew Kurian

Odpowiedzi:


609
git submodule update --recursive

Prawdopodobnie będziesz również chciał skorzystać z opcji --init, która spowoduje, że zainicjuje ona wszelkie niezainicjowane podmoduły:

git submodule update --init --recursive

Uwaga: w niektórych starszych wersjach Git , jeśli użyjesz tej --initopcji, już zainicjalizowane submoduły mogą nie zostać zaktualizowane. W takim przypadku należy również uruchomić polecenie bez --initopcji.


1
Co powiesz na submoduł dodawania rekurencyjnego? „git submodule add FrameworkA.git” wystarczy pobrać pliki FrameworkA.
uzupełnij

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

Czy to różni się od mojej poniżej?
William Entriken,

3
@Irineau Uwaga o tym, że już zainicjowane submoduły nie są aktualizowane, jeśli --initsą używane, nie pasuje do moich doświadczeń z Git 2.2.2. Widzę zarówno moduły najwyższego poziomu, jak i zagnieżdżone, które zostały już zainicjowane, sprawdzając poprawność zatwierdzenia, kiedy używam git submodule update --init --recursive, i uważam, że twierdzenie, że musisz uruchomić polecenie zi bez, --initjest po prostu błędne. O ile ktoś nie będzie w stanie wykazać, że jest to zachowanie, ani wykazać, że zmieniło się ono między wersjami i kiedyś było prawdą, planuję je całkowicie edytować.
Mark Amery

3
@ MarkAmery, pamiętam, że był to problem w niektórych wersjach git, których nie pamiętam. Właśnie przetestowałem to w wersji 1.9.3 i wydaje się, że problem już nie istnieje. Zaktualizowałem odpowiedź, odnosząc się do niejasnych „starszych wersji”. Jeśli ktokolwiek może określić, która wersja zmieniła to zachowanie, byłoby świetnie.
drewag

35

Sposób, w jaki korzystam to:

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

6
Pracowałem nad zmianą ostatniej linii na:git submodule foreach git pull --ff-only origin master
Gilad Peleg

2
Dodałbym również --recursive do ostatniego wiersza: „git submodule foreach --recursive git merge origin master”, w przeciwnym razie można uzyskać brudny submoduł, gdy sam zaktualizuje submoduł.
Michael Scott Cuthbert

Szukałem tego przez ostatnie trzy godziny. Dziękuję Panu. Aby dodać do tego, można także używać tych poleceń za popełnienie takich jak: git submodule foreach --recursive 'git commit -a | :'. :Sprawia, że pętla niezależnie od wyniku. Zobacz łącza stackoverflow.com/questions/19728933/... .
Raczkujący Pidgeon

17

Ponieważ może się zdarzyć, że domyślna gałąź twoich submodułów nie jest master (co zdarza się często w moim przypadku), w ten sposób automatyzuję pełne aktualizacje Git modułów:

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'

Próbowałem dodać to polecenie do mojego ogólnego pliku Makefile, ale wciąż utknąłem, aby GNU Make ignorował interpretację sekwencji $ (...), pomimo jej obecności w prostych cudzysłowach. Czy ktoś ma pomysł?
Sebastien Varrette

Twoje polecenie jest tym, czego potrzebowałem, dziękuję! Ale rozumiem: Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.gdzie Core jest submoduł
Sanandrea

Myślę też, że musisz dowiedzieć się tego komentarza stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi

brak opcji rekurencyjnej oznacza, że ​​działa to tylko wtedy, gdy twoje submoduły nie zawierają ponownie submodułów.
erikbwork

15

W ostatnim Git (używam wersji 2.15.1) następujące rekurencyjnie scalą zmiany podmodułu w submoduły:

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

Możesz dodać, --initaby zainicjować dowolne niezainicjowane submoduły i użyć, --rebasejeśli chcesz dokonać zmiany bazy zamiast scalania.

Następnie musisz zatwierdzić zmiany:

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

Myślałem, że robię coś złego, ale twoja odpowiedź potwierdziła, że ​​to git submodule update --remote my-dir/my-submoduledziała równie dobrze
iomv
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.