Mantenere il repository git all'interno di un altro repository git


125

Ecco cosa vorrei:

REPO-A
  /.git
  /otherFiles
  /REPO-B
    /.git
    /moreFiles

Voglio essere in grado di inviare tutti i contenuti di REPO-A a REMOTE-A e solo REPO-B a REMOTE-B.

Possibile?

Risposte:


104

Sembra che tu voglia usare i sottomoduli Git .

Git risolve questo problema utilizzando sottomoduli. I sottomoduli ti consentono di mantenere un repository Git come sottodirectory di un altro repository Git. Ciò ti consente di clonare un altro repository nel tuo progetto e mantenere separati i tuoi commit.


19
Non esattamente: non spingerà tutto il contenuto del repoA: solo A più un riferimento a B. Ma non critico la tua risposta, mi stavo affrettando a scrivere più o meno lo stesso quando ho riletto la domanda dell'OP;)
VonC

1
Questo è praticamente il caso d'uso dei sottomoduli. REPO-A e REPO-B sono trattati come repository Git a pieno titolo, con i propri commit, origini, storia, ecc.
Damien Wilson,

2
quindi se sto leggendo bene, posso controllare in modo indipendente un repo del sottomodulo-d completamente al di fuori di quello in cui lo trovo? Come posso prendere un repository già esistente e referenziarlo come sottomodulo in un altro progetto?
JohnO

Non stavo cercando esattamente la stessa soluzione di OP e ritengo che in media questa sia probabilmente una risposta più ricercata a una domanda simile: "l'inserimento di git REPO-B all'interno di git REPO-A incorpora un riferimento o una copia completa di git REPO-B? ".
jaya

64

Ho sempre usato collegamenti simbolici per mantenere due repository separati e distinti.


8
per quanto possano sembrare confusi i sottomoduli git e il sottoalbero git, questa è una risposta valida.
Trevor Hickey

Questo è anche molto utile per assemblare un'applicazione da più repository remoti
GeraldScott

22
Per mantenere due repo separati e distinti, non sarebbe corretto mantenere il repo B nel repo A e aggiungere semplicemente il repo B ai repo A .gitignore?
Fabien Snauwaert

1
Stavo pensando di fare quello che suggerisce Fabien, c'è un problema nel farlo in questo modo?
theonlygusti

1
Tengo separati i repository git e copio le modifiche apportate a REPO-B in una copia di REPO-B (senza .git) annidata in REPO-A. Lo faccio con rsync. Corro rsync -avh --delete --exclude='.git' REPO-B/ REPO-A/REPO-B-copy/dopo che ci sono modifiche a REPO-B
Shai

29

Sì, puoi fare esattamente quello che stai chiedendo con la gerarchia dei file che hai disegnato. Repo-B sarà indipendente e non avrà alcuna conoscenza di Repo-A. Repo-A terrà traccia di tutte le modifiche nei propri file e nei file di Repo-B.

Tuttavia, non consiglierei di farlo. Ogni volta che cambi file e esegui il commit in Repo-B, dovrai eseguire il commit in Repo-A. La ramificazione in Repo-B creerà problemi con Repo-A e la ramificazione in Repo-A sarà instabile (problemi durante la rimozione delle cartelle, ecc.). I sottomoduli sono sicuramente la strada da percorrere.


53
Non puoi semplicemente aggiungere REPO-B a /REPO-A/.gitignore?
mikkelbreum

2
@mikkelbreum Ho avuto la stessa identica idea. Attualmente stiamo utilizzando subverion per il nostro progetto principale e utilizziamo un repository git in una delle sottocartelle. Con SVN ho appena aggiunto la cartella con il repository git alla proprietà svn: ignore e mi chiedevo se posso fare lo stesso con git.
2ndkauboy

3
Beh, non riesco a capire perché l'aggiunta di un repository git annidato all'elenco ignora del repository genitore non dovrebbe funzionare .. Ma allo stesso tempo ho la sensazione che ci debba essere qualche problema a cui non ho pensato, poiché questo approccio è visto raramente suggerito, e molte persone scoraggiano i repository Git annidati.
mikkelbreum

18
Ho appena implementato questo scenario esatto. Ho alcuni file CSS non compressi in una sottocartella che non voglio che vengano inviati al repository remoto, quindi è nel mio .gitignore. Ma voglio tenere traccia delle modifiche a questi file localmente. Ho impostato un repository all'interno della cartella con i file non compressi e ho aggiunto tutti i file a quel repository. È ancora ignorato dal repository principale ma posso tenere traccia delle modifiche all'interno del repository secondario. Consigliata o meno, questa soluzione è fondamentale per determinate situazioni come questa.
BrianVPS

1
Ho capito che ogni volta che si cambia ramo in un repository, l'altro vedrà un sacco di modifiche, ma perché "la ramificazione in Repo-A sarà instabile (problemi nella rimozione delle cartelle, ecc.)"? Grazie!
user2688151

2

È possibile ottenere ciò che si desidera (il repository REPO-A contiene tutti i file, inclusi quelli nella cartella REPO-B anziché solo un riferimento) utilizzando "git-subrepo":

https://github.com/ingydotnet/git-subrepo

Funziona ancora se alcuni dei tuoi contributori non hanno installato il comando subrepo; vedranno la struttura delle cartelle completa ma non saranno in grado di eseguire il commit delle modifiche ai subrepos.

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.