git submodule
è implementato come script di shell, quindi è facile vedere cosa sta facendo, potrebbe essere a /usr/lib/git-core/git-submodule
se si sta utilizzando una versione pacchettizzata. In sostanza, esegue il git-fetch
nel sottomodulo se il nome dell'oggetto (SHA1sum) memorizzato nell'albero del progetto principale non corrisponde alla versione ritirata nel sottomodulo, come Koraktor points out.
Il documentation for git fetch
(o man git-fetch
mentre kernel.org non è attivo) dice che dovrebbe recuperare ogni tag che punta a un oggetto scaricato, e gli oggetti scaricati includeranno ogni commit che è un antenato di ogni ramo che viene recuperato. Ciò significa che è sorprendente per me che non si ottengano tutti i tag rilevanti su un git submodule update
.
Se è il caso che quello che vuoi veramente è per il tuo script è provare a impostare una nuova versione di sottomodulo e commettere quel risultato, non penso che lo git submodule update
sia lo strumento che vuoi - è solo per essere sicuro che i tuoi sottomoduli sono nella versione giusta in base a ciò che è attualmente nel commit del progetto principale. Invece si dovrebbe solo fare qualcosa di simile:
(cd my-submodule && \
git fetch && \
git fetch --tags && \
git checkout my-tag)
git add my-submodule
git commit -m 'Update the submodule to the "my-tag" version' my-submodule
(ho aggiunto un extra git fetch --tags
just in case il tag non è uno che punta a un scaricato commesso.
Ovviamente c'è un'altra possibilità: puntare il sottomodulo sul commit su cui punta il tag piuttosto che sul tag stesso, ma questo non sembra accurato.
Beh, l'unica cosa che è memorizzato nella struttura ad albero del progetto principale per il modulo è solo l'hash dell'oggetto commit, quindi, anche se ci fosse un comando che ha detto "impostato il mio modulo al tag my-tag
in quel modulo ", si finirebbe solo memorizzando l'hash corrispondente a quel tag comunque ...
fonte
2011-09-22 06:32:39
Grazie per tutto il tuo aiuto - sembra che il mio problema è che il commit che volevo non è nella storia di nessun ramo. Pensi che ci sia una buona ragione per cui 'git submodule update' fa solo un' git fetch' e non un 'git fetch --tags'? Aggiungendo 'git fetch --tags' si risolverebbe questo problema per chiunque lo incontrasse in futuro. Quando viene eseguito il backup di kernel.org, troverò un punto da segnalare. –
@DuncanParkes che avvia git 1.9/2.0 (1 ° trimestre 2014), 'git fetch --tags' sarà sufficiente (non è necessario aggiungere' git fetch'): http://stackoverflow.com/a/20608181/6309 – VonC