2012-12-12 22 views
18

Ho un repository git con un sottomodulo git al suo interno. Il sottomodulo è ospitato su bitbucket. Voglio aggiornare la mia copia locale del sottomodulo al suo ultimo commit. Sono stanco "aggiornamento modulo sottotitoli" tuttavia non sta facendo nulla. Così ho provato a cancellare la cartella del sottomodulo e poi a fare "sottomulo git init" Tuttavia, si limita semplicemente a inviare il commit del submodule iniziale, non l'ultimo.git submodule init non sta effettuando l'ultimo commit

Come posso ottenere il mio sottomodulo locale per l'aggiornamento all'ultima commit?

risposta

26

Git sta facendo esattamente quello che dovrebbe fare. git submodule update imposterà il tuo submodule su ciò che il commit corrente nel repository padre specifica che il sottomodulo dovrebbe avere. In questo modo è possibile eseguire il checkout di un altro ramo, commit o tag precedente, quindi eseguire git submodule update e il sottomodulo verrà impostato su ciò che si aspetta tale riferimento in modo che l'intera soluzione abbia le dipendenze soddisfatte.

Quello che dovete fare è:

cd mysubmoduledir 
git fetch 
git checkout master # or any other branch that you need the latest of 
git merge origin/master 
cd - # go back to the top repo 
git status # should show that your submodule changed 
git add mysubmoduledir 
git commit -m "Updated my solution to use latest sub project." 

una versione più breve è:

cd mysubmoduledir 
git pull # assumes you are already on the branch you need to be on 
cd - 
git commit -am "Updated submodule" # assumes you had no other modified files 

La parola "aggiornamento" non è il migliore per questo comando modulo. Significa davvero "puntare il sottomodulo sul commit che il commit del repository padre si aspetta".

L'aggiornamento di un sottomodulo a un commit diverso (non deve essere l'ultimo) richiede di effettuare il cd in tale directory, manipolarlo come un normale repo git in modo che il commit corrente sia ciò che si desidera, quindi tornare indietro e commettere questa modifica sul repository di livello superiore.

+0

Che nome ridicolo per un comando ?! Ovviamente dovrebbe essere git submodule etadpu –

+0

Pensare a questo "git submodule ilikepancakes" probabilmente avrebbe molto senso. E se qualcuno non è d'accordo, si prega di leggere una saggia presentazione sulla struttura delle apis dello spazio del kernel: http://man7.org/conf/lca2013/Why_kernel_space_sucks-2013-02-01-printable.pdf –

+0

Ulteriori dettagli sull'uso di 'git submodule ': https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ –

5

Ogni commit git che include un sottomodulo si collega a un commit particolare all'interno del repository del sottomodulo.

Il comando git submodule update viene fornito per aggiornare la versione ritirata del sottomodulo al commit registrato per la versione corrente del repository principale. Potrebbe trattarsi in realtà di una versione precedente rispetto a quella che hai attualmente controllato in quel sottomodulo, ad esempio se stai esaminando una vecchia versione del repository principale che utilizzava una versione precedente del sottomodulo.

Per ottenere una versione più recente del sottomodulo, passare a tale directory e aggiornarla come si farebbe con qualsiasi altro repository git (ad esempio, pull dal repository upstream). Se esegui nuovi commit o ti estrai da un repository diverso da quello che utilizzi come fonte per il sottomodulo, assicurati di inviare le modifiche. Una volta eseguita questa operazione, è possibile tornare al repository principale e confermare la modifica al sottomodulo per registrare il nuovo commit del sottomodulo che si sta utilizzando per il sottomodulo nella versione corrente e nelle versioni future finché non si effettua un altro aggiornamento.

2

Basta provare sotto il comando dopo aver aggiunto i sottomoduli.

per git v 1.8.x

git submodule update --init --recursive --remote 

per v1.7.x:

git submodule update --init --recursive o git pull --recurse-submodules

per v1.6.x

git submodule foreach git pull origin master 

per verificare la versione di Git.

git version