Generalidades
Este artículo explica cómo migrar un repositorio Subversion (SVN) de DreamHost a Git usando git svn. La migración conserva todo el historial de confirmaciones y asigna los usuarios de SVN a las identidades reales de los autores de Git.
Requisitos Previos
Las siguientes herramientas son necesarias y están disponibles en los servidores de DreamHost:
- git
- svn
- git svn (agrupado con Git)
Para confirmar que git svn está disponible, corre:
[server]$ git svn --versionPaso 1 — Inicia sesión y localiza tu repositorio de SVN.
- Inicia sesión en tu servidor a través de SSH del dominio en el que se configuraste el repositorio SVN.
-
Navega a tu directorio principal:
[server]$ cd ~ -
Confirma que el directorio svn esté presente:
[server]$ ls ~/svnDeberías ver tu repositorio en la lista. Por ejemplo:
[server]$ ls ~/svn my_projectLa ruta de tu repositorio SVN generalmente sigue este formato:
/home/username/svn/my_projectLa URL svn+ssh:// que utilizará en los pasos siguientes se construye a partir de tu usuario de DreamHost, el nombre de host al que se conecta usando SSH y esa ruta:
svn+ssh://username@example.com/home/username/svn/my_projectReemplaza username con tu usuario de DreamHost, example.com con el dominio al que te conectas usando SSH y my_project con el nombre de tu repositorio.
Paso 2 — Crear un archivo de asignación de autores.
Las confirmaciones de SVN solo registran un nombre de usuario. Las confirmaciones de Git requieren un nombre y una dirección de correo. Antes de clonar el repositorio, crea un archivo de mapeo que traduzca los usuarios de SVN a las identidades de autor de Git.
-
Corre el siguiente comando para extraer todos los autores únicos de SVN y escribirlos en un archivo:
[server]$ svn log -q svn+ssh://username@example.com/home/username/svn/my_project \ | awk -F '|' '/^r/ {sub(" ","",$2); sub(" $","",$2); print $2" = "$2" <"$2"@example.com>"}' \ | sort -u > ~/authors.txt -
Abre ~/authors.txt en un editor de texto y reemplaza los nombres y direcciones de correo de marcador de posición con el nombre y correo reales de cada colaborador. Cada línea debe seguir este formato:
svnusername = First Last <email@example.com>Ejemplo:
jsmith = Jane Smith <jane.smith@example.com>
El comando anterior extrae únicamente los autores que aparecen en el registro de confirmación. Solo necesitas incluir a esos autores en el archivo.
Paso 3 — Clonar el repositorio de SVN
Utiliza git svn clone para importar el repositorio a un nuevo repositorio Git local.
-
Corre el comando clone desde tu directorio principal:
[server]$ git svn clone --no-metadata -A ~/authors.txt --stdlayout \ svn+ssh://username@example.com/home/username/svn/my_project ~/git-migrationReemplaza la ruta de SVN y ~/git-migration con la ruta de tu repositorio y el directorio de destino preferido.
Este comando:
- Importa todas las confirmaciones con historial completo.
- Asigna nombres de usuario de SVN a autores de Git usando tu archivo authors.txt (-A)
- Elimina los metadatos de seguimiento de git-svn de los mensajes de confirmación (--no-metadata)
- Espera una disposición SVN estándar con los directorios trunk/, branches/, y tags/ (--stdlayout)
Si tu repositorio no utiliza el diseño estándar trunk/branches/tags, revisa la sección Diseños de repositorio no estándar a continuación.
-
Cuando finalices la clonación, cambia al nuevo directorio:
[server]$ cd ~/git-migration -
Corre git log para confirmar que el historial se importó correctamente:
[server]$ git log
Paso 4 (Opcional) — Convertir svn:ignore a .gitignore
Si tu repositorio SVN utilizaba propiedades svn:ignore, conviértelas en un archivo .gitignore:
[server]$ git svn show-ignore > .gitignore
[server]$ git add .gitignore
[server]$ git commit -m "Convert svn:ignore to .gitignore"Paso 5 — Corregir las ramas y etiquetas
git svn importa las ramas y las etiquetas de SVN como ramas de seguimiento remoto en lugar de ramas y etiquetas Git nativas. Este paso las convierte en referencias Git adecuadas y cambia el nombre de trunk a main.
-
Renombra la rama trunk a main:
[server]$ git branch -m trunk main -
Convierta las ramas de etiquetas SVN en etiquetas Git reales. Ajusta la ruta de referencia para que coincida con lo que muestra git branch -a de tu repositorio:
[server]$ git for-each-ref --format='%(refname:short)' refs/remotes/origin/tags \ | sed 's#origin/tags/##' \ | while read t; do git tag "$t" "refs/remotes/origin/tags/$t"; doneCorre git tag para confirmar que las etiquetas se crearon.
Paso 6 — Sube los cambios a tu nuevo repositorio Git
Puedes alojar el nuevo repositorio en tu cuenta de DreamHost a través de SSH. Revisa Configurar un repositorio Git para ver las opciones alojadas en DreamHost.
-
Agrega tu repositorio remoto de Git:
[server]$ git remote add origin git-repository-url -
Envía todas las ramas:
[server]$ git push --all origin -
Envía todas las etiquetas:
[server]$ git push --tags origin
La migración se ha completado. Ahora puedes utilizar los comandos estándar de Git para gestionar el repositorio.
Limpiar el repositorio SVN
Una vez que hayas confirmado que la migración se ha completado, puedes eliminar el repositorio SVN de tu cuenta de DreamHost para liberar espacio en disco:
[server]$ rm -rf ~/svn/my_projectVerifica tu historial de Git y prueba a fondo el nuevo repositorio antes de eliminar el repositorio SVN. Esta acción es irreversible.
Diseños de repositorio no estándar
Si tu repositorio SVN no sigue el diseño estándar trunk/branches/tags, utilice las banderas -T, -b y -t para especificar las rutas manualmente en lugar de --stdlayout:
- -T -- ruta al tronco (predeterminado: trunk)
- -b -- ruta a las ramas (default: branches)
- -t -- ruta a las etiquetas (predeterminado: tags)
Para un control más preciso -- por ejemplo, para importar solo una rama específica -- puedes separar los pasos de inicialización y obtención:
[server]$ git svn init svn+ssh://username@example.com/home/username/svn/my_project ~/git-migration
[server]$ cd ~/git-migration
[server]$ git svn fetchRevisa la documentación de git svn para ver todas las opciones disponibles.
Preguntas Frecuentes
¿La migración conserva el historial completo de confirmaciones?
Sí. git svn clone importa cada commit de tu repositorio SVN, incluyendo información del autor, marcas de tiempo y mensajes de commit. Usar la bandera --no-metadata mantiene limpios los mensajes de commit eliminando las referencias de seguimiento de git-svn.
¿Qué ocurre si falta el autor de una confirmación en authors.txt?
La clonación fallará con un error que indica que falta el nombre de usuario. Agrega el autor a ~/authors.txt y vuelve a ejecutar el comando de clonación.
¿Puedo migrar solo una rama específica en lugar de todo el repositorio?
Sí. Usa git svn init para inicializar el repositorio y luego ejecuta git svn fetch con rutas de rama específicas. La documentación de git svn cubre todas las opciones de fetch disponibles.
Ver también
Enlaces de DreamHost
- Generalidades de Subversion
- Respaldar tu repositorio SVN
- Configurar un repositorio Git
- Generalidades de SSH
Enlaces de terceros