Git aggiorna i sottomoduli in modo ricorsivo


284

Struture del mio progetto

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

Come posso aggiornare i sottomoduli in modo ricorsivo? Ho già provato alcuni comandi git (sulla radice di ProjectA)

git submodule foreach git pull origin master

o

git submodule foreach --recursive git pull origin master

ma non riesco a estrarre i file di Twig.


Che ne dici di git-deep ?
Mathew Kurian,

Risposte:


610
git submodule update --recursive

Probabilmente vorrai anche usare l'opzione --init che lo farà inizializzare tutti i sottomoduli non inizializzati:

git submodule update --init --recursive

Nota: in alcune versioni precedenti di Git , se si utilizza l' --initopzione, i sottomoduli già inizializzati potrebbero non essere aggiornati. In tal caso, dovresti anche eseguire il comando senza --initopzione.


1
Che ne dici di aggiungere un sottomodulo ricorsivo? "git submodule add FrameworkA.git" estrae semplicemente i file di FrameworkA.
complez

2
Puoi semplicemente fare un "git submodule add blah" e poi "git submodule update --init --recursive".
Drewag,

È diverso dal mio modo di seguito?
William Entriken,

3
@Irineau La nota sui sottomoduli già inizializzati che non vengono aggiornati se --initutilizzati non corrisponde alle mie esperienze su Git 2.2.2. Vedo sottomoduli sia di livello superiore che nidificati che sono già stati inizializzati per ottenere il commit corretto verificato quando uso git submodule update --init --recursive, e penso che l'affermazione che è necessario eseguire il comando con e senza --initsia semplicemente sbagliata. A meno che qualcuno non possa dimostrare che questo è il comportamento o dimostrare che è cambiato tra le versioni e che una volta era vero, ho intenzione di modificarlo del tutto.
Mark Amery,

3
@MarkAmery, ricordo che questo è un problema in alcune versioni di git che non ricordo. L'ho appena provato in 1.9.3 e il problema non sembra più esistere. Ho aggiornato la risposta per fare riferimento a vaghe "versioni precedenti". Se qualcuno può specificare quale versione ha modificato questo comportamento, sarebbe fantastico.
Drewag,

35

Il modo in cui uso è:

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

6
Ho lavorato per cambiare l'ultima riga in:git submodule foreach git pull --ff-only origin master
Gilad Peleg il

2
Vorrei anche aggiungere --recursive all'ultima riga: "git submodule foreach --recursive git merge origin master" altrimenti puoi ottenere un sottomodulo sporco quando esso stesso ha aggiornato un sottomodulo.
Michael Scott Cuthbert,

Lo stavo cercando da tre ore. Grazie Signore. Per aggiungere a questo, è anche possibile utilizzare questi comandi per aver commesso, come ad esempio: git submodule foreach --recursive 'git commit -a | :'. Lo :rende loop indipendentemente dal risultato. Vedi link stackoverflow.com/questions/19728933/… .
Principiante Pidgeon

17

Come può accadere che il ramo predefinito dei tuoi sottomoduli non sia master (cosa che succede molto nel mio caso), ecco come automatizzo gli aggiornamenti completi dei sottomoduli Git:

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'

Ho provato ad aggiungere questo comando nel mio generico Makefile, ma sono ancora bloccato per fare in modo che GNU Make ignori l'interpretazione della sequenza $ (...), nonostante sia presente tra virgolette semplici. Qualcuno ha un'idea?
Sebastien Varrette,

Il tuo comando è quello di cui avevo bisogno, grazie! Ma capisco: Entering 'Core' fatal: ambiguous argument 'origin/HEAD': unknown revision or path not in the working tree.dov'è Core il sottomodulo
Sanandrea,

Inoltre, credo che avete bisogno di capire questo commento stackoverflow.com/a/18008139/3383543
Ahmad AlMughrabi

non avere l'opzione ricorsiva significa che funziona solo se i sottomoduli non includono nuovamente i sottomoduli.
erikbwork,

15

In Git recente (sto usando v2.15.1), i seguenti uniranno ricorsivamente le modifiche del sottomodulo a monte nei sottomoduli:

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

È possibile aggiungere --initper inizializzare tutti i sottomoduli non inizializzati e utilizzare --rebasese si desidera riformulare anziché unire.

È necessario eseguire il commit delle modifiche in seguito:

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

Pensavo di aver fatto qualcosa di sbagliato, ma la tua risposta mi ha confermato che git submodule update --remote my-dir/my-submodulefunziona altrettanto bene
iomv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.