leanmind logo leanmind text logo

Blog

Código Sostenible

Cómo escribir código fácil de mantener mediante valores, principios y técnicas.

Fusionando repositorios de Git sin morir en el intento

Por José Luis Rodríguez Alonso y Aitor Santana

En este artículo voy a explicar como unir varios repositorios de Git en uno solo, llevándonos también el histórico de commits que tengamos en cada uno de los repositorios que queramos unir.

Magic Gif

Esta problemática me surgió porque quería tener un único repositorio para las katas, tenía demasiados repositorios sueltos y quería organizarlo un poco.

Después de consultarlo con algunos compañeros, José Luis Rodríguez me dió la clave, me comentó que él lo había hecho en algún proyecto y me pasó la receta que solucionó todos mis problemas.

Lo apliqué casi al pie de la letra, tuve que tener en cuenta algunas cosillas, pero funcionó. Veamos cuál es esa receta mágica 🪄.

Conocimientos Previos

Para poder realizar estos pasos son necesarios conocimientos sobre las ramas de Git, comandos tales como:

Instrucciones

Te recomiendo este cheat sheet de Git creado por el equipo de GitHub, en el que se ven estos comandos y lo más utilizados en Git.

Primeros pasos

Lo primero que haremos será crear un repositorio vacío, en el cual queramos tener la unión de nuestros repositorios.

1
2
3
4
5
mkdir katas
cd katas
git init
git commit -m "Initial commit" --allow-empty
git branch -M main

Nos traemos los cambios de uno de los repos a mergear

Una vez tenemos el repo global, vamos a añadir el origen remoto del repo a copiar.

1
git remote add git@github.com:lean-mind/mars-rover-kata.git

Seguidamente nos traemos los cambios de ese repo.

1
git fetch --all -p

Y creamos una rama con los cambios que nos hemos traido para empezar la migración.

1
git checkout -b mars-rover-kata mars-rover-kata/main

Debemos tener en cuenta, que mars-rover-kata hace referencia a la rama en local que hemos generado con el checkout, y mars-rover-kata/main a la rama ‘main’ del remoto que añadimos.

Migrando el repositorio

Ahora debemos crear una carpeta para guardar los ficheros que contiene el repositorio.

1
2
mkdir mars-rover-kata
git mv Rover.kt, RoverShould.kt mars-rover-kata

Este paso también podemos hacerlo con ayuda de un IDE si nos resulta más cómodo.

Lo siguiente será hacer un commit para guardar los cambios.

1
2
git add mars-rover-kata
git commit -m "Move 'Mars Rover Kata' to 'mars-rover-kata' subdirectory" repo

En este punto, podemos repetir los pasos con otros repositorios o directamente pasarlo todo a la rama principal.

Pasando los cambios a la rama principal

Lo único que nos queda es volver a la rama principal y hacer un merge con la rama en la que se encuentran los cambios de otros repositorios.

1
2
git checkout main
git merge --allow-unrelated-histories mars-rover-kata -m "Import 'Mars Rover Kata'"

Este último comando es la clave de todo, nos permite fusionar dos historias de repositorios no relacionados, importando el contenido del repositorio “mars-rover-kata” al repositorio actual, con un mensaje de commit personalizado. El paso final para unir el global con ‘mars-rover-kata’.

Cuando acabemos, recomiendo que borremos la rama donde estaban los cambios que nos hemos traído y su origen remoto.

1
2
git branch -D mars-rover-kata
git remote rm mars-rover-kata

Bonus Track

Otra cosa interesante que podemos hacer si tenemos un repositorio con múltiples proyectos, es clonar sólo el directorio con el que vamos a trabajar. Para ello, vamos a usar el comando sparse-checkout, disponible desde la versión 2.25 de Git.

Es importante que habilitemos el modo “sparse-checkout” para poder hacer esto; de lo contrario, no veremos ningún cambio. Esto lo podemos hacer de la siguiente manera:

1
git config core.sparseCheckout true

Si ya tenemos este modo habilitado podemos empezar:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
## Clonamos el repo vacío
git clone --no-checkout git@github.com:lean-mind/katas.git

## Nos movemos dentro del repo
cd katas

## Inicializamos el sparse-checkout
git sparse-checkout set mars-rover-kata

## Actualizamos el espacio de trabajo para ver los cambios
git read-tree -mu HEAD

Conclusión

Esta fórmula es una buena opción, si por algún motivo nos piden unir dos o más repositorios y no perder el histórico de cambios, o si, como yo, queréis organizar las katas en un único punto 🤓.

Publicado el 17/10/2023 por
José Luis image

José Luis Rodríguez Alonso

¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.

Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?

Impulsamos el crecimiento profesional de tu equipo de developers