2012-03-20 11 views
9

Ho due repository Git non collegati (non condividendo alcun antenato), uno è un super repository che consiste in un numero di progetti più piccoli (Lo chiamiamo repository A). Un altro è solo un repository Git locale di fortuna per un progetto più piccolo (chiamiamolo repository B). Graficamente, sarebbe simile a questaCome combinare due distinti repository Git non collegati in uno con un'unica cronologia cronologia

A0-B0-C0-D0-E0-F0-G0-HEAD (repo A) 
A0-B0-C0-D0-E0-F0-G0-HEAD (remote/master bare repo pulled & pushed from repo A) 
A1-B1-C1-D1-E1-HEAD (repo B) 

Idealmente, mi piacerebbe davvero a fondersi repo B in pronti contro termine A con un'unica timeline storia. Quindi sembrerebbe che ho originariamente iniziato progetto in pronti contro termine A. Graficamente, questo sarebbe il risultato finale ideale

A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (new repo A) 
A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (remote/master bare repo pulled & pushed from repo A) 

Ho fatto qualche lettura con sottomoduli e sottostruttura (Pro Git è un buon libro per la via), ma entrambi sembrano soddisfare la soluzione per mantenere due rami separati con il sottomodulo che è in grado di estrarre le modifiche da upstream e sottostruttura con un leggero mal di testa. Entrambe le soluzioni richiedono comandi git aggiuntivi e specializzati per gestire i check in e la sincronizzazione tra il ramo principale e secondario/modulo. Entrambe le soluzioni determinano anche più timeline (con sottostruttura si ottengono anche 3 timeline separate quando si usa --squash).

La soluzione più vicina di SO sembra parlare di "graft", ma è davvero così? L'obiettivo è quello di avere un unico repository unificato dove posso tirare/spingere i check-in, in modo che non ci sia più repo B, solo repo A alla fine.

+0

possibile duplicato di [Come si fa a unire due repository git?] (Http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories) –

+0

@MichaelDurrant No, rifiuto la soluzione di sottostruttura e sottomodulo in quanto lo scenario non è lo stesso – Antony

risposta

5

penso lo si fa in questo modo:

  1. git add remoto [repo b]
  2. git fetch // ottenere il repo b in pronti contro termine un
  3. causa si desidera mantenere la cronologia In questo modo: A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H (dal repository B) -HEAD (nuovo repository A) è possibile selezionare prima A0 come punto iniziale dopo, usa git cherry-pick uno per uno.

Spero che questo sia utile per te.

Br, Tim

+0

Combinato la tua soluzione insieme a questa guida @ http://gbayer.com/development/moving-files-from-one-git-repository- to-another-preserving-history /, funziona! – Antony

Problemi correlati