Cómo hacer que parte de un repositorio GIT existente sea un submódulo
-
22-09-2019 - |
Pregunta
Tengo este repositorio de git que contiene dos carpetas: binary-search
y poker
.Por ejemplo, http://github.com/soulnafein/code-katas
Me gustaría convertir estas carpetas en submódulos y conservar su historial de cambios.
¿Cómo puedo hacer eso?
Solución
La idea general es utilizar 'git filtro-rama' y los siguientes pasos:
1) Cree un submódulo usando --subdirectory-filter de filter-branch
(después de clonar su repositorio).
$ git filter-branch --subdirectory-filter ABC HEAD -- --all
Mira esto Entonces pregunta para obtener más información sobre este paso.
2) Crear un superproyecto usando un filtro de índice de filter-branch
para eliminar el submódulo.
$ git filter-branch --index-filter "git rm -r -f --cached --ignore-unmatch ABC" --prune-empty HEAD
3) Confirme el submódulo con la última versión del superproyecto.
Ver Separe el subdirectorio en un repositorio git separado para un ejemplo práctico.
Cada submódulo mantendrá su historial.
Pero como se dice en este propuesta de parche, sería:
perder todas las conexiones históricas entre el superproyecto y el submódulo, rompiendo herramientas como '
git bisect
', y dificulta la recuperación de versiones antiguas.Idealmente, cada versión del superproyecto recién creado estaría vinculada a la versión correcta del submódulo (y todas las entradas .gitmodules también estarían configuradas correctamente a lo largo del historial del proyecto)
Si no necesitas tener el historial previo vinculado a los nuevos submódulos, puedes seguir los pasos mencionados anteriormente.
Pero si necesita realizar una bifurcación desde un punto anterior mientras tiene referencias a sus submódulos (que actualmente son subdirectorios simples), podría considerar probar el script mencionado en el parche al que me refiero.Se discute en este hilo, pero todavía está integrado en Git, como dice Junio C Hamano:
Desafortunadamente, no creo que hayamos diseñado completamente (ni implementado en absoluto) un comportamiento para verificar diferentes puntos de la historia en los que el mismo submódulo se mueve en el árbol del superproyecto.
Otros consejos
Hoy en día hay una mejor forma de hacer esto: git subtree