2009-12-14 12 views
57

Quando si cambia ramo con git checkout, presumo che la maggior parte delle volte si desideri aggiornare i sottomoduli.Perché l'aggiornamento del modulo Git non è automatico al checkout di git?

  • In quale situazione si fa a non desidera aggiornare sottomoduli dopo il passaggio?
  • Cosa si romperebbe se ciò fosse stato eseguito automaticamente da git checkout?

aggiornato ai esempio:

  • Branch A ha sottomodulo S a 3852f1
  • Branch B ha modulo S a fd72d7

Su ramo A, git cassa B si tradurrà in un copia di lavoro del ramo B con sottomodulo S a 3852f1 (con S modificata). l'aggiornamento del sottomodulo git effettuerà il checkout S a fd72d7.

+2

Correlato: http://stackoverflow.com/questions/4611512/is-there-a------re-make-git-pull-automatically-update-submodules – philfreo

+1

sono d'accordo con te. Sto lavorando con il progetto con i sottomoduli e dopo ogni estrazione dovrei eseguire l'aggiornamento del sottomodulo git, ma non è necessario alla maggior parte del tempo. l'unica ragione per farlo è non perdere quando uno dei sottomoduli è stato effettivamente aggiornato. –

risposta

19

Credo che i sottomoduli che non si aggiornano automaticamente siano in linea con gli obiettivi di sviluppo di Git. Git è pensato per funzionare in una modalità distribuita e non presume che siate in grado di connettervi a un repository non locale a meno che non lo dite esplicitamente. Git non autoaggiornando un sottomodulo sarebbe il comportamento previsto quando si pensa in quel modo.

Con ciò detto, se si sa che si desidera sempre che i sottomoduli vengano estratti e si sappia che non si diramano mai da quei sottomoduli in un altro repository locale, non si dovrebbe rompere nulla se si li ha aggiornati automaticamente dopo un checkout.

+37

Penso che git checkout dovrebbe solo lamentarsi se il commit per un submodule non era disponibile invece di lasciare la directory di lavoro in uno stato incoerente per impostazione predefinita. Quindi è possibile eseguire l'aggiornamento del modulo sottotitolo per recuperare il commit referenziato. Di nuovo, normalmente il commit sarà disponibile e il pagamento può essere effettuato senza alcun accesso alla rete. Accettare la tua risposta poiché sembra ragionevole (ma non mi piace;) – serbaut

+1

Io secondo l'idea che git dovrebbe provare a fare un init di sottomodulo e aggiornare alla cassa iniziale e lamentarsi e mostrare in stato se esiste un sottomodulo che non ha ' è stato tirato localmente la prima volta. Dopo averlo fatto una volta la nozione di dover aggiornare esplicitamente ha senso perché i repository sono distinti e il sottomodulo fa riferimento a un commit specifico. Ma anche in un mondo distribuito in cui potrebbe non essere disponibile, molto probabilmente lo vorrà ad un certo punto e git dovrebbe farti sapere che non è mai stato tirato. – cclark

+4

'git fetch' ha un'opzione per * scaricare automaticamente i sottomoduli *, quindi penso anche che il checkout dovrebbe avere un'opzione simile per l'aggiornamento automatico/checkout dei sottomoduli. –

4

git checkout --recurse-submodules saranno aggiunti a git 2.13

Questo è menzionato sulle note di rilascio all'indirizzo: https://github.com/git/git/commit/e1104a5ee539408b81566066aaa6963cb87d5cd6#diff-c24776ff22455a30fbb78e378b7df0b0R139

Sul this mailing list thread, il dev Git Randall S. Becker dice che intende anche aggiungere una configurazione submodule.recurse in seguito per accenderlo di default, che a mio avviso è probabile che si unisca a un certo punto.

Quindi non ci resta che attendere che diventi il ​​valore predefinito su git 3.0! :-)