Muchos proyectos comienzan como algo chico, dentro de un único repositorio Git, pero a medida que el tiempo avanza, y el proyecto se vuelve algo más complejo, es probable que surja la necesidad de separar una parte del proyecto a otro repositorio. Cuando esto sucede, algo que no queremos es perder toda la historia de esos archivos, o sea, queremos mover los archivos correspondientes a un subproyecto junto con toda su historia.
Objetivo
- Mover el directorio 1 desde el repositorio A al repositorio B.
Restricciones
- No queremos mover el resto de los directorios del repositorio A.
- Queremos mantener el historial de cambios del directorio que moveremos al repositorio B.
Preparándonos para mover
Lo primero que haremos será clonar nuestro repositorio, ¡lo último que queremos es perder información valiosa por ejecutar un comando errado!
Desde el directorio padre donde queremos generar la carpeta con nuestra copia ejecutamos:
git clone .\<DirectorioOrigen> <DirectorioDestino>
Nos movemos dentro del directorio:
cd <DirectorioDestino>
Y removemos el enlace al repositorio origen:
git remote rm origin
De esta forma evitamos hacer cambios sobre el repositorio remoto (en nuestro DirectorioOrigen).
Si los archivos que deseamos mover no se encuentran en un directorio, deberemos moverlos a uno (aquí lo llamaremos directorio 1).
Removiendo lo que ya no queremos
Dejamos sólo el directorio que nos interesa
Ahora ejecutaremos el comando que se encargará de remover todos los archivos que no se encuentren dentro del directorio que le indicamos (aquel que queremos mover al nuevo repositorio):
git filter-branch --subdirectory-filter <directorio 1> -- --all
Quitamos los tags (opcional)
Es probable que hayamos creado tags sobre commits que ya no existen, por lo que borraremos todos los tags que hayan quedado en nuestro repositorio.
Para ello abrimos una ventana de comandos y ejecutamos lo siguiente:
FOR /f "tokens=*" %a in ('git tag') DO git tag -d %a
O en PowerShell:
git tag | foreach-object { git tag -d $_ }
Borrar sólo algunos tags
Si quisiéramos borrar sólo algunos de los tags, por ejemplo aquellos que comiencen con un determinado prefijo, podemos usar el siguiente comando de PowerShell:
git tag | foreach-object { if ($_ -like '<Prefijo>*') { git tag -d $_ } }
Completamos el cambio
Agregamos el link al nuevo repositorio
Para agregar el link al nuevo repositorio que hayamos creado para el subproyecto usamos:
git remote add origin https://url-nuevo-repositorio.git
Podemos verificar que esto esté configurado correctamente usando:
git remote -v
Push de los cambios
Lo último que nos falta es llevar todos estos cambios al nuevo repositorio:
git push -u origin NOMBRE-DEL-BRANCH
Gracias por el post. Realmente muy utíl cuando hay que desarmar un bodoque y trasformarlo en microservicios.