2010-02-12 22 views
5

Ho un repo principale (repo 1) con cui lavoro. Ho un altro repo (repo 2) che deve adattarsi al primo e non sono sicuro di come potrei averli entrambi nella stessa cartella. L'idea è di avere una base di codice standard di cui ho bisogno in ogni progetto, ma ogni progetto è il proprio repository git.Come si combinano due repository git?

/project 
    /.git(repo 2) 
    /.git(repo 1) 
    /repo_2_sub 
     /repo_2_sub_sub 
      /repo_1_sub_sub 
    /repo_1_sub 
     /repo_1_sub_sub 
     /repo_2_sub_sub 

Nessuno dei file si sovrappone, ma alcune delle strutture di cartelle lo fanno. Così a volte certe cartelle da un repository saranno nell'altro repository.

Come posso lavorare in modo che questi due repository costruiscano il codebase completo?

UPDATE

Entrambi repos git esistono nello stesso livello cartella principale del progetto. Non possono essere sottomoduli poiché si incrociano l'uno contro l'altro come mostrato sopra. Non sono cartelle separate.

UPDATE 2

Aspetta, forse questo è più facile di quanto pensassi. È possibile clonare un repository codebase standard e quindi creare un nuovo ramo che è il progetto e quindi continuare a unire quel ramo con il repository codebase ogni volta che cambia?

+1

Leggendo gli aggiornamenti e le risposte qui, sembra che la risposta corretta sia quella di separare i due progetti distinti in una struttura di dipendenza più sicura. – Novelocrat

+0

Sì, penso di sì. – Xeoncross

risposta

1

Aspetta, forse questo è più facile di quanto mi pensiero. È possibile clonare un repository di codebase standard e quindi creare un nuovo ramo che è il progetto e quindi continuare a unire il ramo con il repository di codebase ogni volta che cambia?

Si potrebbe fare. Ho anche un progetto in cui lo sto facendo in questo modo. La maggior parte del codice è la stessa per tutti i sottoprogetti. Creo un nuovo ramo per ogni progetto per mantenere separati i file che appartengono solo a quel progetto. Unisco regolarmente il ramo master agli altri rami.

È inoltre possibile creare cloni del repository principale. Quindi devi semplicemente unire le modifiche dal ramo origin/master al ramo master in ciascuno dei tuoi progetti.

+0

Sembra che questo sia il modo più semplice per gestire qualcosa di simile in quanto non è necessario spiegare una configurazione complessa a ciascun membro del team e per ogni progetto. Inoltre sembra meno pron a errore. – Xeoncross

2

Uso git submodule

Aggiornamento:

La base di codice standard che deve essere una parte di tutti i repository deve essere un repository git distinta separata.

git submodule add <repo_nick_name> <repo_path> 

aggiungerà tale repository a questo. Su cloning e push, solo il file .gitmodules e l'hash al repository verranno inseriti/clonati.

git submodule init 

e

git submodule update 

inizializza rispettivamente e aggiorna i repository sottomodulo remoti.

Per informazioni dettagliate, controllare lo screencast dello scot chacon git community book documentation on git submodules e/o scot sullo stesso.

+0

Il problema è che sono progetti nella stessa directory di base. – Xeoncross

+0

Questo non dovrebbe essere un problema. i sottomoduli esistono nella stessa cartella del modulo. –

2

Modifica: per avere due directory .git, quando le inizi, ci sarebbe un po 'di lavoro in più. Quando si inizia, si:

git --git-dir=.git1 --work-tree=. init 
git --git-dir=.git2 --work-tree=. init 

Ora si hanno due dir git nella stessa directory. Non molto carina. A questo punto, assicurati di avere .git1 e .git2 in entrambi .gitignores, poiché non vengono ignorati per impostazione predefinita. Inoltre, ogni comando git che esegui deve avere anche l'argomento --git-dir per specificare il repository con cui stai interagendo. È possibile impostare alias per questo.

Poiché sono nella stessa directory di base e i sottomoduli non funzionano, è possibile inserire file ".gitignore" all'interno di entrambe le directory ".git/info/exclude". Inserendoli in .git/info/exclude si assicura che l'altro repository non raccolga le esclusioni.

Potrebbe richiedere un po 'di manutenzione se i due reposli differiscono per una granularità più fine rispetto alle cartelle, ma se si specifica in ciascuno.gitignore i file che appartengono solo al repository OTHER, dovrebbe funzionare.

See: gitignore

+0

In realtà non si possono avere due cartelle '.git' - li ho appena messi lì per mostrare quello che * penso di volere *. – Xeoncross

+0

Beh, puoi, ci vuole solo del lavoro extra. Vedi la mia modifica. – bobDevil

+0

Pazzo. Non credo che andrò su questa strada poiché sembra un tale trucco. Inoltre, sarebbe un problema impostare un gruppo di installazioni di gruppo come questo. Fantastico sapere che funziona comunque! – Xeoncross

Problemi correlati