1. Introducción
Una de las cosas más importantes en el desarrollo de software, a mi parecer, es el uso de herramientas que te faciliten la vida, esto puede incluir desde el todo poderoso depurador hasta el sistema de control de versiones que uses.
Desde hace un par de años conocí el sistema gestión de versiones subversion y, no me puedo quejar, me ha sido de gran ayuda. Pero tiene algunos inconvenientes al momento del desarrollo lo cual me obliga a cambiar realmente de gestor de versiones.
Hace un tiempo instalé gitolite, un servidor de versiones para git, pero sólo lo he utilizado para otros proyectos. Actualmente acabo de lograr instalar mi propio servidor gitorious (no tengo la culpa de no confiar en servidores externos a mi red local ) y he decido definitibamente migrar a git de la mano de mi servidor gitorious instalado localmente.
1.1 Contenido
- Instalación svn2git en gentoo linux
- Creación de reglas de conversión
- Migrar el servidor local git al remoto
2. Instalación de svn2git
Antes de comenzar, hay que resaltar que existen varias herramientas llamadas svn2git , esta guia hablará exclusivamente de https://www.gitorious.org/svn2git/svn2git/, este proyecto fue creado por los desarrolladores de KDE para migrar de su antiguo repositorio subversion a git(igual a lo que quiero hacer yo ). En gentoo linux la instalación es sencilla, primero debemos agregar la siguiente línea a tu archivo package.keywords:
dev-vcs/svn2git ~amd64
No te olvides cambiar ~amd64 por la arquitectura de tu instalación, finalmente lo instalamos con el siguiente comando:
emerge svn2git
Sencillo!, el problema viene en las distribuciones linux que no tengan este paquete en sus repositorios, la única opción sería compilar. Esta herramienta esta desarrollada bajo el toolkit Qt, en caso de que desees compilarlo, necesitarás instalar las bibliotecas de desarrollo de Qt.
3. Reglas de exportación
Antes de continuar primero debemos crear una regla de exportación, esto le dirá a svn2git cómo debe realizar la migración, crearemos el archivo reglassvn.rules con el siguiente contenido:
# # Declare the repositories we know about: # create repository myproject end repository # # Declare the rules # Note: rules must end in a slash # #match /trunk/ # min revision 1 # max revision 478 #end match match /trunk/ repository myproject branch master end match match /branches/[^/]+ action recurse end match
Este archivo de reglas migrará toda la carpeta trunk (se supone que esta carpeta en subversion es usada para colocar el código fuente base) a la rama master de nuestro repositorio git e ignorará todo lo de la carpeta branches(esta carpeta se usa en subversion para colocar desarrollos paralelos a la rama principal). En mi caso yo solo quiero migrar los cambios de la rama principal (trunk), en caso de que desees, puedes consultar una lista de ejemplos de reglas de svn2git aquí.
4. Migrando a git
Ahora viene la parte más sencilla, pero lenta según el tamaño de repositorio a migrar, una vez creado el archivo de reglas usaremos el comando svn2git para migrar el repositorio subversion:
svn2git --resume-from 1 --rules <archivo de reglas> <ruta del repositorio>
Donde:
<archivo de reglas>: Es el archivo de reglas creado anteriormente reglassvn.rules.
<ruta del repositorio>: Es la ruta de tu repositorio subversion que vas a migrar, debe ser el repositorio del servidor y no tu copia local.
4.1. Continuar desde una versión
Mientras migraba hubo un error en la version 477, por lo cual svn2git se detuvo el error era el siguiente:
Exporting revision 477 "/branch/0.2/diagramitems/ficheros/ORM/CppQt4/cppqt4.cpp" did not match any rules; cannot continue
No se por que ocurre, pero detecté que de la versión 475 a 479 eran los cambios en las ramas(lo cual no deseaba migrar), así que simplemente continué la exportación desde la versión 480 de la siguiente manera:
svn2git --resume-from 480 --rules <archivo de reglas> <ruta del repositorio>
Fíjese en el 480 después del argumento --resume-from. Después de migrar solo falta mover nuestro repositorio local git a un servidor remoto.
5. Moviendo el servidor local git al servidor remoto.
A diferencia de subversion, git puede funcionar como un servidor local, lo cual ayuda a subir cambios de código sin necesidad de estar conectado al servidor principal, esto cambios pueden ser subidos posteriormente a un servidor o fusionados en un servidor. Al finalizar la migración con svn2git se habrá creado la carpeta myproject el cual es el repositorio local, antes de poder subirlo al servidor remoto, primero, debemos clonar nuestra copia local:
git clone myproject/ proyectogit
Ahora ingresamos a nuestra copia local de nuestro proyecto:
cd proyectogit
Eliminamos la referencia a nuestro servidor local (myproject):
git remote remove origin
Agregamos la referencia a nuestro servidor remoto:
git remote add origin git@tuquito.no-ip.biz:def/def.git
El servidor git remoto git@tuquito.no-ip.biz:def/def.git corresponde a la ruta de mi servidor git, debes cambiarlo por el tuyo. Finalmente migramos todo la copia local al servidor de origen con:
git push -u origin master
Listo!, con esto no solo hemos migrado de subversion a un repositorio local git, sino que también este repositorio local lo hemos migrado a un servidor remoto.