2013-02-27 19 views
14

Ho un repository git con più sottomoduli. Uno di questi sottomoduli ha più sottomoduli di sua proprietà. Tutto quello che sto cercando di fare è controllare un vecchio commit sul master repo e farlo controllare i commit appropriati da tutti i sottomoduli per ottenere lo stato corretto del codice in quel momento.Come eseguire il checkout del vecchio commit git inclusi tutti i sottomoduli in modo ricorsivo?

So che git contiene le informazioni necessarie poiché il comando ls-tree può dirmi su quale commit è stato attivato ciascun sottomodulo. Tuttavia, devo controllare manualmente ciascuno di essi, il che richiede molto tempo.

Sto cercando qualcosa come git checkout --recursive ma un tale comando non sembra esistere.

Esiste comunque?

+0

Nota: 'git checkout --recurse-submodules' esiste al giorno d'oggi (2017). Ma solo il prossimo Git 2.14 lo farà funzionare correttamente. Vedi [la mia risposta sotto] (https://stackoverflow.com/a/44249558/6309). – VonC

risposta

17

avete bisogno di due comandi per raggiungere questo obiettivo:

git checkout *oldcommit* 
git submodule update --recursive 
+1

Grazie mille! Ovviamente si è rivelato essere qualcosa di semplice. –

4

A seconda se o non ci sono più sottomoduli nella vecchia cassa, potrebbe essere necessario eseguire le seguenti operazioni per inizializzare sottomoduli che non ci sono più in nuovi commit:

git checkout *oldcommit* 
git submodule init 
git submodule update --recursive 
6

NOTA: se si dispone di più moduli (e sottomoduli all'interno sottomoduli), Git 2.14 (Q3 2017) vi aiuterà (più recente che l'OP dal 2013)

git checkout --recurse-submodules 

L'utilizzo di --recurse-submodules aggiornerà il contenuto di tutti i sottomoduli inizializzati in base al commit registrato nel superproject.
Se le modifiche locali in un sottomodulo verranno sovrascritte, il checkout avrà esito negativo a meno che non venga utilizzato -f.

"git checkout --recurse-submodules" non ha funzionato del tutto con un modulo che si ha sottomoduli. Sarà con Git 2.14.

+0

Non capisco perché '-f' sia sempre necessario. Senza '-f' non aggiorna i sottomoduli. – linquize

+0

@linquize '-f' dovrebbe essere necessario solo se nel sottomodulo sono presenti modifiche locali. – VonC

Problemi correlati