2012-04-26 18 views
8

Quindi ho due repository git. Il primo è il nostro framework (penso db astrazione, funzioni) e poi un altro git repo per il nostro nuovo progetto.Come nidificare repository git; recuperare e unire

voglio includere il repo quadro git nel git del progetto, e secondo GitHub Aiuto, questo dovrebbe funzionare:

cd /project 
git remote add framework git://github.com/username/Framework.git 
git fetch framework 
git merge framework/master 

Il problema è che quando faccio l'unione, si porta tutto tutti i file da framework e semplicemente li scarica nella radice del progetto. Invece, come possiamo avere i file framework uniti in una directory figlia come /project/framework/?

risposta

20

Si consiglia di esaminare il supporto di Git submodule. Un submodule ti consente di incorporare un repository git all'interno di un altro repository git. Ci sono alternative solutions per questo genere di cose, ma non li ho usati da solo.

Un esempio potrebbe essere simile a questo:

$ git clone git://github.com/username/project.git 
$ cd project 
$ git submodule add git://github.com/username/framework.git framework 
$ git commit -m "added framework submodule" 

Se si sta copiando un repository con sottomoduli, è necessario utilizzare l'opzione --recursive:

$ git clone --recursive git://<repository-with-submodules>.git 

Oppure, in alternativa, è possibile clonare regolarmente e quindi eseguire:

$ git submodule init 
$ git submodule update 

Leggere il documento collegato (e git submodule --help) per ulteriori informazioni.

Se vengono apportate modifiche al modulo, è portarli in questo modo:

# first update the submodule just like any other git repository 
$ cd project/framework 
$ git pull 

# now you have to record the new commit in the parent repository 
$ cd .. 
$ git commit -m "updated framework submodule" 

L'ultimo passaggio è necessario perché git tiene traccia dello specifico commit associato a un determinato modulo (in modo che quando qualcuno clona il genitore che otterrà quella versione del sottomodulo, piuttosto che la sua revisione più aggiornata, che avrebbe potuto subire modifiche irrisolte che avrebbero impedito che funzionasse come previsto con il repository principale). Quindi, se aggiorni il sottomodulo, devi registrare il nuovo commit nel genitore.

Se si apportano modifiche nel sottomodulo framework, si otterrà nuovamente solo git push come si farebbe con qualsiasi altro repository. Dovresti quindi eseguire il commit della nuova revisione nel modulo genitore.

+0

Perfetto, quindi quando vengono apportate modifiche a Framework, come faccio a inserirle nel progetto ora che è un modulo? Inoltre, se apporto le modifiche a Framework anziché a Project, come posso reinserirle nel Framework git repo? – Justin

+0

Ho aggiornato la mia risposta. – larsks

+0

Una piccola nota. Il sottomodulo HEAD è staccato quindi è necessario fare attenzione a fare modifiche nel sottomodulo. Creare un ramo (o passare a un ramo), apportare le modifiche, eseguire il commit e quindi premere. – GoZoner

Problemi correlati