2012-05-04 17 views
30

I love git submodules. Inoltre, odio i sottomoduli git. Quello che mi piace di loro è come ti consente di compartimentare in modo pulito le dipendenze, ecc. Ho il senso di farle puntare a uno specifico commit su un repository, lo faccio. Ma nel mio caso, sto costruendo una libreria che verrà utilizzata in un altro progetto, quindi voglio mantenerla in un repository separato.I sottomoduli Force Git per essere sempre aggiornati

Tuttavia, il fastidio arriva quando lavoro quotidianamente su questa libreria e devo costantemente tornare all'app utilizzando la mia libreria per eseguire il commit dell'aggiornamento del puntatore.

Quindi, è possibile avere un sottomodulo git solo essere sempre sulla testa del repository a cui punta mentre sto aggiornando e aggiungendo costantemente a questa libreria?

+0

fa questo aiuto? http://stackoverflow.com/questions/1777854/git-submodules-specify-a-branch-tag –

risposta

18

No, e questo è di progettazione. Se ci fosse un modo per puntare un sottomodulo al "capo corrente" di qualche altro repository, allora sarebbe impossibile recuperare una versione storica (come una versione taggata) dal repository principale. Non saprebbe quale versione del sottomodulo controllare.

Detto questo, potresti essere interessato allo script git subtree. Questo offre un modo diverso di lavorare con i sottomoduli che potrebbero essere più compatibili con il tuo flusso di lavoro. Mi è stato appena ricordato dal recente post on HN.

+2

sì, ho capito, quello che sto dicendo è che voglio che il mio repository padre aggiorni automaticamente il puntatore del sottomodulo ogni volta ci sono cambiamenti commessi localmente nel sottomodulo. Se ho il progetto A che ha il sottomodulo X, quando vado nel sottomodulo X mentre lavoro sul progetto A, devo costantemente fare 2 commit, uno nel sottomodulo, poi di nuovo nel genitore. Non è un grosso problema se stai lavorando su un sottomodulo che non cambia molto, ma quando devi costantemente andare avanti e indietro, diventa davvero fastidioso ....Sembra che dovrei essere in grado di avere il mio repository locale solo commit sia nella versione – Ben

+1

: dire al mio repository locale di impegnare automaticamente l'aggiornamento del puntatore del sottomodulo per me quando applico le modifiche al sottomodulo ... – Ben

+2

Suppongo che tu possa scrivere uno script che usi quando ti impegni con il sottomodulo, questo automaticamente farà un commit corrispondente nel modulo genitore. In alternativa, è possibile scrivere uno script da eseguire nella directory di lavoro del modulo genitore, che esegue automaticamente le commit per tutti i sottomoduli che sono stati aggiornati dall'ultimo commit del progetto principale. –

0

Perché non apportare modifiche all'interno della directory del sottomodulo, che a sua volta è un repository git? In questo modo, la tua app avrà sempre una libreria aggiornata.

Avvertenze:

  1. è ancora necessario per confermare la modifica modulo all'interno della vostra app repo di mettere il cambio di controllo di versione (per l'applicazione).

  2. Se ci sono più app di una che utilizzano questa libreria, non funzionerà, dal momento che solo una app sarà aggiornata in un dato momento.

24

Come detto in "git submodule tracking latest", dal momento che è possibile git 1.8.2 (marzo 2013) fare un modulo traccia HEAD del ramo:

git submodule add -b <branch> <repository> [<path>] 

Uno SHA1 modulo è ancora registrato nella repo genitore come gitlink (special entry in the index)

Ma un git submodule update --remote aggiornerà che l'ingresso al SHA1 corrispondenza HEAD del ramo repository remoto modulo.

Se si dispone di un modulo esistente, you can make it follow a branch con:

cd /path/to/your/parent/repo 
git config -f .gitmodules submodule.<path>.branch <branch> 

cd path/to/your/submodule 
git checkout -b branch --track origin/branch 
    # if the master branch already exist: 
    git branch -u origin/master master 

cd /path/to/your/parent/repo 
git add path/to/your/submodule 
git commit -m "Make submodule tracking a branch" 
+0

Ogni volta che eseguo 'git submodule update --remote' il sottomodulo torna al commit e ho perso il riferimento HEAD –

+0

Facendo' git submodule foreach git pull' non succede. –

+0

@MarceloFilho che non è sorprendente considerando che un sottomodulo non effettua il checkout di un ramo. Se è configurato per seguire un ramo remoto, allora 'git submodule update --remote --recursive' è l'unico comando necessario. Controlla i tuoi moduli .git per vedere se/quei sottomoduli seguono (s) un ramo. – VonC

Problemi correlati