working with upstream unable migrar information from determine commands branches git svn history

with - Importación retroactiva de svn en git



migrate svn to git with branches (2)

Aquí está mi problema:

  1. Usé Subversion por un tiempo, hasta que cambié a Git. Un poco más de tiempo transcurrido.
  2. No hubo ninguna importación de la historia de Subversion a Git. Era una comprobación estricta, eliminación de los directorios .svn, luego git init. No es un movimiento inteligente.
  3. Ahora, miles de git se comprometen más tarde. Encuentro una copia de seguridad del repositorio de Subversion en el momento en que se produjo el primer commit de git. Aha!

Me gustaría revertir el repositorio de git al día 0, importar correctamente el repositorio de svn, luego volver a aplicar todos los cambios de git, y así corregir lo que no se hizo la primera vez.

¿Alguien ha intentado esto? ¿Cómo voy a hacer esto? Suena como la madre de todas las rebases.


Nunca he intentado lo que quieres, pero estoy haciendo algo similar con CVS.

Básicamente, sugeriría:

  1. Crea un nuevo repositorio de git con el historial de svn
  2. En este nuevo repositorio, git fetch todo del repositorio git (no habrá commits en común)
  3. Luego, git branch remote/branch branch-last y git rebase --onto svn-last remote/branch-first branch-last , donde remote/branch-first es la primera confirmación de tu repositorio de git importado, etc.

Si tienes más sucursales, las cosas son más complicadas. Creo que repetir el paso 3 podría servir, pero será mejor que te pruebes. Si tiene fusiones en su historial de git, puede necesitar git rebase -i -p ... Recuerde, la ventaja de git es que básicamente no puede arruinar nada (especialmente si está trabajando en un repositorio separado).


Suena como un trabajo para injertos git. La documentación para esto es un poco incompleta, pero básicamente lo que quieres hacer es esto:

  1. Obtenga una copia de git-svn del svn en su repositorio. La forma más sencilla de hacer esto es clonar svn clone, luego buscar el clon svn en su repositorio existente
  2. Averigua qué compromiso base debe seguir el compromiso svn. Entonces probablemente tengas una raíz de git en algún lado ("Última versión de SVN") que debería seguir a la última versión de SVN. Este es el jefe del clon git-svn que acabas de obtener
  3. Crea un archivo .git / info / injertos y coloca los dos sha en una sola línea. El primero es el primer commit de git, luego un espacio, luego el último commit de svn. Esto le dice a git que el commit git no es parentless, pero de hecho tiene el último commit svn como parent.
  4. Ahora puede verificar con gitk / gitx / lo que sea que los dos repositorios están conectados
  5. Para que el cambio sea permanente, ejecute git filter-branch. Probablemente quieras leer su página de manual primero.

También puedes hacer el paso 3 para todas tus sucursales, por supuesto. El problema con el enfoque de jpalecek es que la rebase aplanará su historial, por lo que si tuviera alguna fusión, la rebase los perderá. El enfoque de rama de filtro mantiene su historial intacto.