Git - Merge de dos repositorios en uno - Más allá de lo que ves

domingo, 19 de enero de 2014

Git - Merge de dos repositorios en uno

En la entrada Git Svn - Importar de Subversion a Git mostraba como importar a Git dos proyectos que tenemos en Subversion con su histórico de commits... Vamos ahora a ver como unificar esos dos repositorios Git en uno solo.

Recordemos que tenemos un proyecto "mi-proyecto" que se compone de dos módulos que hemos importado a repositorios Git diferentes desde Subversion, "mi-proyecto-webmodule" (ubicado en http://url/mi-proyecto-webmodule.git) y "mi-proyecto-modelomodule" (ubicado en http://url/mi-proyecto-modelomodule.git)

Comencemos, los pasos son muy sencillos.

1. Vamos a crear un capeta para el proyecto completo, p.e. /dev/mi-proyecto.
$ mkdir -p /dev/mi-proyecto


2. Dentro de este inicializamos Git.
$ cd /dev/mi-proyecto
$ git init


3. Añadimos un primer commit (añadimos por ejemplo un fichero README al proyecto) para poder hacer merge.
$ touch README
$ git add .
$ git commit -m 'Añadimos el fichero README del proyecto'

4. Añadiremos un remoto al proyecto mi-proyecto-webmodule.git
$ git remote add -f webmodule http://url/mi-proyecto-webmodule.git

5. Hacemos merge de webmodule/master en la rama master de nuestro repositorio local.
$ git merge webmodule/master

6. Ahora movemos todos los fichero del proyecto mi-proyecto-webmodule a una carpeta para contener el código específico del módulo. Imaginemos que la estructura del proyecto mi-proyecto-webmodule está organizada en dos carpetas "src" y "web", entonces tendríamos:
$ mkdir mi-proyecto-wm
$ git mv src/ mi-proyecto-wm/
$ git mv web/ mi-proyecto-wm/
$ git add .
$ git commit -m 'Movemos el código del proyecto web a la carpeta mi-proyecto-wm'

7. Para el proyecto mi-proyecto-modelomodel debería proceder igual desde los puntos 3 al 6, la secuencia de comandos sería la que sigue. Vamos a considerar que el contenido en este caso se encuentra bajo la carpeta src:
$ git remote add -f modelomodule http://url/mi-proyecto-modelomodule.git

$ git merge modelomodule/master

$ mkdir mi-proyecto-jm
$ git mv src/ mi-proyecto-wm/
$ git add .
$ git commit -m 'Movemos el código del proyecto modelo a la carpeta mi-proyecto-jm'

Listo ya tenemos en nuestro repositorio ambos proyectos fusionados con su histórico de commits.

Si ahora queremos publicar nuestro código en un repositorio remoto no tendríamos más que añadir nuestro remoto y hacer push:
$ git remote add -f origin http://url/mi-proyecto.git

$ git push -u origin master

En la próxima entrega...


Hoy hemos agrupado en un solo repositorio el código completo que forma nuestro proyecto compuesto por un módulo principal y una librería. Si bien esto es correcto y nos permite que a medida que nuestro proyecto evoluciona podamos crear tags que establecen concretamente el código completo que forma una versión concreta, probablemente nos interese tener la carpeta mi-proyecto-jm conectada con http://url/mi-proyecto-modelomodule.git de forma que podamos recibir actualizaciones de esta librería o bien aportar cambios o mejoras. En la próxima entrada veremos como realizar esto utilizando "Git Subtree". Nos vemos.

Espero que pueda ser útil.


Saludos.

No hay comentarios:

Publicar un comentario