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.

skompletować
źródło
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.

Drawag
źródło
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
William Entriken
źródło
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'
Sebastien Varrette
źródło
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'
mrts
źródło
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