2011-01-15 25 views
7

Sono nuovo di git per i sottomoduli e noto che si riferiscono sempre a commit specifici.Sottomoduli Git sul master

C'è un modo per i sottomoduli di un superproject di fare sempre riferimento alla testa del ramo master, quindi "git submodule update" o "git pull" nel superprogetto fa semplicemente "git pull" su tutti i sottomoduli.

Grazie.

+0

http://gitref.org/ La pagina di riferimento Git è un buon modo per iniziare se si è nuovi a git. –

+1

@Saher: questa è una domanda molto specifica, non solo una "I'm new to git". – Cascabel

+0

Penso che la risposta sia no. Git memorizza il nome del commit quando registra le informazioni del sottomodulo, e nel mio caso ho scritto una serie di script per tirare, aggiungere, eseguire commit e push che fa esattamente ciò che voglio che faccia con i sottomoduli. – sinelaw

risposta

11

La risposta breve è no. L'idea è che sai per certo che uno specifico commit del sottomodulo funzionerà con il tuo progetto, e non vuoi che alcun comportamento indefinito o inaspettato arrivi ricevendo aggiornamenti al volo. Un sottomodulo è direttamente rappresentato da due cose: una voce in .gitmodules e un gitlink, che è un riferimento allo SHA1 del commit desiderato del sottomodulo. SHA1, non refname.

Quello che stai chiedendo è davvero che il superprogetto abbia nessuna idea cosa c'è nel sottomodulo. Pensaci: i diversi cloni del tuo progetto avrebbero potuto aggiornare il sottomodulo in momenti diversi e finire con versioni diverse di esso lì, e quindi se fossero stati commessi nel tuo progetto, avrebbero dovuto registrare diversi commit nel sottomodulo. Quando vi siete uniti, dovreste semplicemente ignorare ciò che entrambi dicono e tirare di nuovo, probabilmente. Il risultato è che la tua richiesta sta evitando l'intera idea di sottomoduli: per sapere cosa hai. Se dici che stai usando "master", torneresti tra due mesi e non hai idea di cosa significhi!

Se si desidera ottenere sempre il ramo master corrente, è meglio farlo da soli. Scrivi uno script per inserire tutti i sottomoduli ed eseguirlo di tanto in tanto, inserendo le versioni aggiornate. (Prova prima, però!) Il punto qui è che con i sottomoduli, per ogni commit di superprogetto, devi sapere esattamente quale versione del sottoprogetto stai usando. A tua scelta quanto spesso desideri aggiornare la versione del sottomodulo; può essere quotidiano se vuoi.

L'alternativa sarebbe aggiungere la directory (i) per il sottomodulo (i) al proprio gitignore e scrivere un piccolo script veloce per aggiornarli (e probabilmente uno per clonarli). Questo ti costerebbe la possibilità di sapere quale versione avevi a un certo punto nel passato.

+0

Appositamente, come sempre. +1 – VonC

+0

Grazie molto chiaro - è ora di tirare fuori le abilità di scripting .. – Sam

+1

@Jefromi: Forse potresti aggiornare la tua risposta dato che è possibile in git adesso? Vedi la risposta di VonC. – Onur

10

aggiornamento del 2013, dal momento che git 1.8.2, un modulo in grado di seguire un ramo (e non solo fare riferimento a un fisso commit)

Vedere "git submodule tracking latest".


(risposta originale gennaio 2011)

Questo è uno dei differences between git submodules and (for instance) svn:externals.

Un sottomodulo dovrebbe essere un insieme di file con un ciclo di vita diverso, dal quale si seleziona un commit specifico per lavorare sul proprio progetto (il repository padre).
Se il sottomodulo pubblica un nuovo commit, non è necessario interrompere tutto, perché improvvisamente il progetto non si compila più a causa delle ultime evoluzioni del suddetto sottomodulo.

Se, d'altro canto, i due set di file sono così strettamente correlati che la modifica di qualsiasi cosa in uno significa l'aggiornamento dell'altro, allora dovrebbero essere veramente parte di un unico repository.

Problemi correlati