2011-10-18 11 views
119

Nei miei script, uso spesso librerie (mie o di altri ') che hanno i propri repository. Non voglio duplicare quelli nel mio repository e rimanere bloccato con l'aggiornamento di loro ogni volta che esce una nuova versione. Tuttavia, quando qualcuno clona il repository, dovrebbe comunque funzionare localmente e non avere collegamenti interrotti.Come posso avere dipendenze collegate in un repository git?

Qualche idea su cosa potrei fare?

risposta

168

È possibile farlo con i sottomoduli in git. Nel repository, fai:

git submodule add path_to_repo path_where_you_want_it 

Quindi, se repository della biblioteca aveva un URL di git://github.com/example/some_lib.git e si voleva a lib/some_lib nel progetto, devi inserire:

git submodule add git://github.com/example/some_lib.git lib/some_lib 

notare che questa necessità da fare dalla directory di primo livello nel tuo repository. Quindi non scrivere cd nella directory in cui lo stai mettendo per primo.

Dopo aver aggiunto un modulo, o ogni volta che qualcuno fa un checkout fresco del repository, è necessario fare:

git submodule init 
git submodule update 

E poi tutti i sottomoduli che hai aggiunto sarà controllato allo stesso revisione che hai

Quando si desidera aggiornare ad una nuova versione di una delle biblioteche, cd nel modulo e tirare:

cd lib/some_lib 
git pull 

Poi, quando si esegue una git status si dovrebbe vedere lib/somelib elencati nella sezione modificata. Aggiungi quel file, esegui il commit e sei aggiornato. Quando un collaboratore inserisce tale commit nel proprio repository, vedrà lib/somelib come modificato fino a quando non verrà eseguito nuovamente git submodule update.

+2

Grazie per la tua risposta, svalutato! (e probabilmente lo accetterò domani) C'è un modo per aggiungere un solo file all'altro repository come una dipendenza? O deve essere un'intera cartella? –

+2

Se vuoi tracciarlo come un sottomodulo (e quindi, essere in grado di inserire facilmente gli aggiornamenti) dovrai inserire l'intero repository. A differenza di molti altri VCS, git vuole solo occuparsi del repository di primo livello. – Emily

+3

[leggi questo] (https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/) per sapere a cosa serve un sottomodulo e le soluzioni per aggirare il problema potenziali problemi. e [una discussione a riguardo] (https://news.ycombinator.com/item?id=3904932). – minghua