Repository Gid nidificati?


182

Posso annidare i repository Git? Io ho:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

Ha senso per git init/addla /project_rootper facilitare la gestione di tutto ciò che a livello locale o devo per gestire my_projecte il 3 ° partito separatamente?

Risposte:


159

Forse stai cercando la funzione Git chiamata sottomoduli . Questa funzione consente di gestire i repository dipendenti nidificati all'interno del repository principale.


43
Come un principiante git relativo, ho trovato questo blog / tutorial più facile da capire chrisjean.com/2009/04/20/… Ci vuole un approccio più semplice concentrandosi solo su git invece di avere il contesto di uno script di helper shell; Ho trovato più facile da leggere.
John K,

4
Il blog chrisjean.com non sembra essere aggiornato basandosi sul solo tentativo di seguirlo. Il post della wiki di Greg potrebbe essere un po 'più complicato, ma come novizio git preferisco preciso a semplice ...
saggio

Il blog sembra funzionare bene ora, e sfortunatamente per prudenza, i 34 (ora 35) voti positivi sul commento sembrano concordare che c'è un valore nell'articolo del blog. Si scopre che non è necessario sacrificare l'accuratezza per chiarezza e consigli specifici per l'operazione. Dopo averlo letto, immaginerei che l'autore avesse già studiato un po 'e probabilmente letto l'attuale documentazione di Git , non solo la pagina wiki di kernel.org. La spiegazione orientata al Git dell'autore del blog in un esempio completamente contestualizzato sembra essere abbastanza utile per un gran numero di persone ...
Matthew Weber

13
A proposito che il collegamento chrisjean menzionato sopra è morto. Il link aggiornato è chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh,

35

Metti le tue librerie di terze parti in un repository separato e usa i sottomoduli per associarle al progetto principale. Ecco una guida:

http://git-scm.com/book/en/Git-Tools-Submodules

Nel decidere come segmentare un repository, di solito decido in base alla frequenza con cui li modifico. Se si tratta di una libreria di terze parti e solo le modifiche che stai apportando ad essa è l'aggiornamento a una versione più recente, dovresti sicuramente separarla dal progetto principale.


22

Solo per completezza:

C'è un'altra soluzione, che consiglierei: fusione sottoalbero .

A differenza dei sottomoduli, è più facile da mantenere. Dovresti creare ogni repository nel modo normale. Mentre sei nel tuo repository principale, vuoi unire il master (o qualsiasi altro ramo) di un altro repository in una directory della tua directory principale.

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

Quindi, per estrarre l'altro repository nella directory (per aggiornarlo), utilizzare la strategia di unione subtree:

$ git pull -s subtree OtherRepository master

Sto usando questo metodo da anni ormai, funziona :-)

Maggiori informazioni su questo modo, incluso il confronto con i sottomoduli, sono disponibili in questo git howto doc .


Il riferimento alla fusione delle sottostrutture nel libro git non funziona più. Attualmente, questo sembra essere il link: git-scm.com/book/en/v2/…
ericx

18

Potresti aggiungere

/project_root/third_party_git_repository_used_by_my_project

per

/project_root/.gitignore

ciò dovrebbe impedire l'inclusione del repository nidificato nel repository principale e si può lavorare con essi in modo indipendente.

Ma: se un utente esegue git clean -dfx nel repository principale, rimuoverà il repository nidificato ignorato. Un altro modo è collegare simbolicamente la cartella e ignorare il collegamento simbolico. Se si esegue git clean, il collegamento simbolico viene rimosso, ma il repository "nidificato" rimarrà intatto poiché risiede davvero altrove.



5

Sommario.

Posso annidare i repository git?

Sì. Tuttavia, per impostazione predefinita git non tiene traccia della .gitcartella del repository nidificato. Git ha funzionalità progettate per gestire i repository nidificati (continua a leggere).

Ha senso git init / aggiungi il / project_root per facilitare la gestione di tutto a livello locale o devo gestire my_project e quello di terze parti separatamente?

Probabilmente non ha senso in quanto git ha funzionalità per gestire i repository nidificati. Le funzionalità integrate di Git per gestire i repository nidificati sono submodulee subtree.

Ecco un blog sull'argomento ed ecco una domanda SO che copre i pro ei contro dell'utilizzo di ciascuno.


2

Vorrei usare un repository per progetto. In questo modo, la cronologia diventa più facile da consultare.

Verificherei anche la versione della libreria di terze parti che sto utilizzando, nel repository del progetto che la utilizza.

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.