Aggiorna un sottomodulo all'ultimo commit


269

Ho un progetto A che è una libreria e viene utilizzato in un progetto B.

Entrambi i progetti A e B hanno un repository separato su github MA all'interno di B abbiamo un sottomodulo di A.

Ho modificato alcune classi nella libreria, che si trova nel repository A, ho inserito il repository remoto, quindi la libreria (repository A) viene aggiornata.

Questi aggiornamenti non riflettono sul "riferimento" (il sottomodulo) a cui il sottomodulo fa riferimento a un precedente commit .... cosa devo fare per aggiornare il sottomodulo su git?

Risposte:


358

Immettere la directory del sottomodulo:

cd projB/projA

Estrai il repository dal tuo progetto A ( non aggiornerà lo stato git del tuo genitore, progetto B):

git pull origin master

Torna alla directory principale e controlla l'aggiornamento:

cd ..
git status

Se il sottomodulo è stato aggiornato in precedenza, mostrerà qualcosa di simile al seguente:

# Not currently on any branch.
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   projB/projA (new commits)
#

Quindi, esegui il commit dell'aggiornamento:

git add projB/projA
git commit -m "projA submodule updated"

AGGIORNARE

Come ha sottolineato @paul, da git 1.8, possiamo usare

git submodule update --remote --merge

per aggiornare il sottomodulo all'ultimo commit remoto. Sarà conveniente nella maggior parte dei casi.


35
A proposito, se non sei il proprietario del sottomodulo, puoi farlo solo git submodule updatequando qualcun altro ha aggiornato il projA (otterrai un nuovo ID di commit).
Kjuly,

possiedo il repository principale del sottomodulo (proj A) ma sono un committer nel proj B.
grasso

@Kjuly Dopo il commit, come si fa a spingerlo sul telecomando? È giusto git push?
KR29,

1
@ KR29 giusto, e il cmd completo è git push <remote> <branch>, ad es git push origin dev.
Kjuly,

2
git submodule updatefunziona senza flag solo quando è stato eseguito il pull di un commit (nel proj B) che aggiorna i riferimenti ai sottomoduli in questione (proj A). Per aggiornare il pro B per fare riferimento al HEADramo di tracciamento remoto per il pro A, ti consigliamo di fare git submodule update --remote --mergecome mostrato nella risposta di Paul Hatcher di seguito.
Ben Burns,

109

Da git 1.8 puoi fare

git submodule update --remote --merge

Ciò aggiornerà il sottomodulo all'ultimo commit remoto. Sarà quindi necessario eseguire il commit della modifica in modo da aggiornare gitlink nel repository padre

git commit

E quindi spingere le modifiche come senza questo, l'identità SHA-1 che punta al sottomodulo non verrà aggiornata e quindi la modifica non sarà visibile a nessun altro.


Anche se lo faccio git committutti gli altri non lo vedono ancora. On branch master Your branch is up-to-date with 'origin/master'. Changes not staged for commit: modified: SubmoduleA (new commits) modified: SubmoduleB (new commits)
Max N

1
Hai fatto una "git push" dopo il tuo commit, tieni presente che il commit modifica solo il tuo repository locale, devi inviarlo al telecomando affinché tutti gli altri lo vedano
Paul Hatcher

Manca da questa risposta (ma annotata nelle altre risposte di seguito): i sottomoduli aggiornati devono essere messi in scena git addprima di impegnarsi.
joshng,

1
@joshng Sento che tutti quelli che stanno lavorando ai sottomoduli lo capiranno. Questo è l'unico post che mi ha aiutato, grazie mille.
Husk Rekoms,

38

Se aggiorni un sottomodulo e ti impegni, devi passare al repository di livello superiore o di livello superiore e aggiungere la modifica lì.

git status

mostrerà qualcosa come:

modified:
   some/path/to/your/submodule

È anche possibile vedere il fatto che il sottomodulo non è sincronizzato

git submodule

l'output mostrerà:

+afafaffa232452362634243523 some/path/to/your/submodule

Il plus indica che il tuo sottomodulo punta verso il punto in cui il repository superiore si aspetta che punti.

aggiungi semplicemente questa modifica:

git add some/path/to/your/submodule

e impegnalo:

git commit -m "referenced newer version of my submodule"

Quando si esegue il push up delle modifiche, accertarsi di eseguire prima il push up della modifica nel sottomodulo, quindi di inserire la modifica di riferimento nel repository esterno. In questo modo le persone che eseguiranno l'aggiornamento saranno sempre in grado di funzionare correttamente

git submodule update

Maggiori informazioni sui sottomoduli sono disponibili qui http://progit.org/book/ch6-6.html .


Se non vedi a +quando corri git submodule, assicurati di aver inizializzato e importato i sottomoduli. I comandi per questo sono git submodule inite git submodule update, rispettivamente.
fureigh

19

Versione a linea singola

git submodule foreach "(git checkout master; git pull; cd ..; git add '$path'; git commit -m 'Submodule Sync')"

2

Alcune delle altre risposte raccomandano l'unione / il commit nella directory del sottomodulo, che IMO può diventare un po 'confusa.

Supponendo che il server remoto sia chiamato origine vogliamo il masterramo del sottomodulo (i), tendo ad usare:

git submodule foreach "git fetch && git reset --hard origin/master"

Nota: questo eseguirà un hard reset su ogni sottomodulo - se non lo si desidera, è possibile passare --harda --soft.


1

Il mio progetto dovrebbe usare il "più recente" per il sottomodulo. Su Mac OSX 10.11, versione git 2.7.1, non avevo bisogno di andare 'nella' cartella del mio sottomodulo per raccogliere i suoi commit. Ho semplicemente fatto un regolare

git pull --rebase 

al livello superiore e ha aggiornato correttamente il mio sottomodulo.


0

La risposta di Andy ha funzionato per me sfuggendo a $ path:

git submodule foreach "(git checkout master; git pull; cd ..; git add \$path; git commit -m 'Submodule Sync')"

Probabilmente il motivo per cui la risposta di @Andy Webov non richiedeva la fuga era perché utilizzavano virgolette singole intorno al percorso, ad es. '$path'
S0AndS0
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.