2011-09-21 15 views
13

Ho un repository git che usa un sottomodulo che vorrei puntare a un tag annotato, ma quando faccio i tag git submodule update non vengono scaricati. Posso ottenere nuovi tag nel sottomodulo inserendo cd nel sottomodulo e facendo uno git fetch --tags lì, ma mi piacerebbe davvero fare tutto questo da fuori come è scriptato.È possibile aggiornare git submodule per recuperare i tag nei sottomoduli?

Non riesco a trovare nulla nella documentazione git suggerendo un modo per ottenere git submodule update per includere i tag (la mia versione git è 1.7.3.5).

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.

C'è un modo per ottenere git submodule update per includere i tag?

risposta

6

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 --tagsjust 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 ...

+0

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. –

+1

@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

0

è possibile creare script in modo che si fa un (cd path-to-submod && git fetch)

avvolgendo i comandi tra parentesi mette l'ambiente in una subshell, significato, non c'è bisogno di CD indietro a dove eravate.

Spero che questo aiuti

3

git submodule update non prendere nulla se i vostri sottomoduli sono up-to-date. Quindi questo potrebbe essere un malinteso.

git submodule update porterà il contenuto della directory di lavoro dei sottomoduli nel repository allo stato definito (ad esempio, verificare il commit del sottomodulo che è stato definito nel repository).

Un modo migliore sarebbe quella di cd nel vostro modulo (che è un repository Git stesso) e semplicemente eseguire git fetch --tags e poi git checkout some-tag. Dopo che il sottomodulo è stato aggiornato nella tua directory di lavoro su some-tag e puoi metterlo in scena per l'invio.

+0

Hai ragione, ho avuto questo malinteso, ma non era il mio problema principale, che è quello di aver impostato il sottomodulo per puntare a un tag di commit, quando controllo da qualche altra parte e faccio l'aggiornamento del modulo di git, esso si lamenta che non riesce a trovare il commit. Ho deciso di puntare il genitore sul tag commit. –

13

Risposta tardiva qui, ma sono sorpreso che nessuno abbia menzionato lo git submodule foreach. Questo è fondamentalmente il modo in cui ho risolto il problema esatto che si è verificato:

git submodule foreach --recursive 'git fetch --tags' 
git submodule update --recursive 

--recursive bandiera è lì per ricorsione in sottomoduli bambino.

Problemi correlati