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.