2012-03-20 13 views
9

Tengo dos repositorios Git no relacionados (sin compartir ningún ancestro), uno es un super repositorio que consiste en varios proyectos más pequeños (vamos a llamarlo repositorio A) Otro es solo un repositorio Git local improvisado para un proyecto más pequeño (vamos a llamarlo repositorio B). Gráficamente, se vería asíCómo combinar dos repositorios Git independientes no relacionados en uno con línea de tiempo de historia única

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, me gustaría fusionar repo repo B en A con una sola línea de tiempo de la historia. Por lo que parece que en un principio empecé proyecto en repo A. Gráficamente, este sería el resultado final ideales

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) 

He estado leyendo de cartuchos y sub-árbol (Pro Git es un muy buen libro por cierto), pero ambos parecen proporcionar una solución para mantener dos ramas separadas con un submódulo capaz de extraer los cambios de la cadena ascendente y un subárbol que es un poco menos dolor de cabeza. Ambas soluciones requieren comandos git adicionales y especializados para manejar los chequeos y la sincronización entre la rama maestra y subárbol/módulo. Ambas soluciones también dan como resultado múltiples líneas de tiempo (con subárbol incluso se obtienen 3 líneas de tiempo separadas al usar --squash).

La solución más cercana de SO parece hablar de "graft", pero ¿es eso realmente? El objetivo es tener un repositorio único y unificado donde pueda hacer check-in para que no haya más repositorio B, solo repo A al final.

+0

posible duplicado de [¿Cómo combinar dos repositorios Git?] (Http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories) –

+0

@MichaelDurrant No, rechazo la solución de subárbol y submódulo ya que el escenario no es el mismo – Antony

Respuesta

5

Creo que lo haces de esta manera:

  1. git add remoto [repo b]
  2. git fetch // obtener el repositorio b repo en un
  3. debido a que desea conservar la historia como este: A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H (del repositorio B) -HEAD (nuevo repositorio A) primero puede seleccionar el A0 como punto de inicio Después de eso, usa git cherry-pick uno por uno.

Espero que te sea útil.

Br, Tim

+0

Combinado su solución junto con esta guía @ http://gbayer.com/development/moving-files-from-one-git-repository- a-otro-preservar-historial /, ¡funciona! – Antony

Cuestiones relacionadas