Come posso avere dipendenze collegate in un repository git?


149

Nei miei script, utilizzo spesso librerie (mie o di altre) che hanno i propri repository. Non voglio duplicare quelli nel mio repository e rimanere bloccato ad aggiornarli ogni volta che esce una nuova versione. Tuttavia, quando qualcuno clona il repository, dovrebbe comunque funzionare localmente e non avere collegamenti interrotti.

Qualche idea su cosa potrei fare?

Risposte:


212

Puoi farlo con i sottomoduli in git. Nel tuo repository, esegui:

git submodule add path_to_repo path_where_you_want_it

Quindi, se il repository della libreria avesse un URL di git://github.com/example/some_lib.gite lo volessi lib/some_libnel tuo progetto, dovresti inserire:

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

Si noti che questo deve essere fatto dalla directory di livello superiore nel repository. Quindi non cdentrare nella directory in cui la metti per prima.

Dopo aver aggiunto un sottomodulo o ogni volta che qualcuno effettua un nuovo checkout del tuo repository, dovrai fare:

git submodule init
git submodule update

E poi tutti i sottomoduli che hai aggiunto verranno verificati con la stessa revisione che hai.

Quando si desidera aggiornare a una versione più recente di una delle librerie, cdnel sottomodulo e tirare:

cd lib/some_lib
git pull

Quindi, quando lo fai git status, dovresti vedere lib/somelibelencati nella sezione modificata. Aggiungi quel file, esegui il commit e sarai aggiornato. Quando un collaboratore inserisce il commit nel proprio repository, lo vedrà lib/somelibmodificato fino a quando non verrà eseguito git submodule updatenuovamente.


2
Grazie per la tua risposta, votato! (e probabilmente lo accetterà domani) C'è un modo per aggiungere solo un file dall'altro repository come dipendenza? O deve essere un'intera cartella?
Lea Verou,

2
Se vuoi seguirlo come un sottomodulo (e quindi, essere in grado di estrarre facilmente gli aggiornamenti) dovrai estrarre l'intero repository. A differenza di molti altri VCS, git vuole davvero solo gestire il repository di alto livello.
Emily,

7
leggi questo per sapere a cosa serve un sottomodulo e come risolvere potenziali problemi. e una discussione al riguardo .
minghua,

1
supponiamo che importi come sottomodulo un altro repository che possiedi. È possibile apportare modifiche al repository originale tramite le modifiche locali nel sottomodulo? Diciamo che hai trovato un bug e devi aggiornare l'originale?
andrevenancio,

3
So che questa è una vecchia risposta, ma i sottomoduli git possono essere aggiornati usando git submodule update --remoteconsiglio di usare più flag per progetti più complessi. Usogit submodule update --remote --recursive --init
Chris il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.