He heredado un repositorio de git que contiene varios proyectos en directorios separados. Me gustaría dividir el repositorio en nuevos repositorios individuales, uno para cada proyecto y luego hacer que el repositorio principal contenga los proyectos como submódulos. Me gustaría hacer todo esto manteniendo el historial de revisión de los proyectos individuales si es posible.
Podría clonar el repositorio para cada proyecto y eliminar todos los demás proyectos cada vez, pero ¿hay una mejor manera de evitar tener el historial clonado en cada nuevo repositorio de proyectos?
git
git-submodules
cidrado
fuente
fuente
Respuestas:
Puede utilizar
git filter-branch
para reescribir el historial de un proyecto. De la documentación:Haga varias copias de su repositorio, hágalo para cada subdirectorio que desee dividir, y debería terminar con lo que está buscando.
fuente
--subdirectory-filter
varias veces. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
,--subdirectory
etc.no tomarán varios directorios, pero se pueden especificar varias veces.foodir
en el proyecto original, sin reescribir su historial,git rm -r foodir
debería ser suficiente (eso también eliminará la copia en su árbol de trabajo; si no lo desea, use--cached
). Si desea eliminarlo por completo del historial (respondiendo también a la pregunta de @ilius), desea algo comogit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
solución es más rápida que--tree-filter
, ya que no tiene que verificar los archivos, solo puede manipular el índice directamente. El--tree-filter
puede ser un poco más fácil de usar, sin embargo, como se puede utilizar operaciones filsystem ordinarios en lugar de tener que trabajar con las operaciones de manipulación de índice.Para exportar una carpeta como un nuevo repositorio, necesita:
Abra la carpeta del repositorio clonado y ejecute este comando:
fuente
git subtree
no está disponible como paquete Cygwin. Si lo necesita: stackoverflow.com/a/27116828/2484903El punto de git es que el historial se incorpora en cada confirmación mediante el hash del compromiso principal. Podrías "reproducir" las confirmaciones (así es esencialmente como funciona el importador svn) en un nuevo repositorio y solo conservando cada subproyecto. Sin embargo, esto destruiría el significado de los valores hash de confirmación. Si no tiene ningún problema con eso, que así sea.
En el pasado simplemente lo cloné y seguí adelante. Esto hace que las cosas sean más grandes, pero el espacio en disco es barato; mi tiempo es caro.
Tampoco conozco ninguna herramienta para empalmar un directorio. Supongo que podría git-log en el directorio para encontrar todas las confirmaciones en él y luego reproducir las confirmaciones con algo como git-fast-export.
fuente