# Introducción En este artículo voy a explicar cómo 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. ![Imagen](https://media3.giphy.com/media/3o84U6421OOWegpQhq/giphy.gif?cid=ecf05e47ebrpzbq9ntzxzvwn93ulyopkgbtkkri7wu3a78qm&ep=v1_gifs_search&rid=giphy.gif&ct=g) 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 me dio 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 🪄. # Instrucciones ## Primeros pasos Lo primero que haremos será crear un repositorio vacío en el cual queramos tener la unión de nuestros repositorios. ```bash= $mkdir global-repo $cd global-repo $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. ```bash= $git remote add git@github.com:lean-mind/repo.git ``` Seguidamente nos traemos los cambios de ese repo. ```bash= $git fetch --all -p ``` Y creamos una rama con los cambios que nos hemos traido para empezar la migración. ```bash= $git checkout -b repo repo/main ``` Debemos tener en cuenta que **repo hace referencia a la rama en local** que hemos generado con el checkout y **repo/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. ```bash= $mkdir repo $git mv fichero1, fichero2 repo ``` 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. ```bash= $git add repo $git commit -m "Move 'repo' to 'repo' 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. ```bash= $git checkout main $git merge --allow-unrelated-histories repo -m "Import 'repo'" ``` Este último comando es la clave de todo, nos permite **fusionar dos historias de repositorios no relacionados**, importando el contenido del repositorio "repo" al repositorio actual, con un mensaje de commit personalizado. El paso final para unir el global con 'repo'. Cuando acabemos, recomiendo que borremos la rama donde estaban los cambios que nos hemos traído y su origen remoto. ```bash= $git branch -D repo $git remote rm repo ``` # Bonus Track Otra cosa interesante que podemos hacer si tenemos un repositorio con múltiples proyectos es** clonar solo 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: ```bash= $git config core.sparseCheckout true ``` Si ya tenemos este modo habilitado podemos empezar: ```bash= # Clonamos el repo vacío $git clone --no-checkout git@github.com:lean-mind/global-repo.git # Nos movemos dentro del repo $cd global-repo # Inicializamos el sparse-checkout $git sparse-checkout set repo # 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 🤓.