Migrando de subversion a git con svn2git

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 cheeky) y he decido definitibamente migrar a git de la mano de mi servidor gitorious instalado localmente.

1.1 Contenido

  1. Instalación svn2git en gentoo linux
  2. Creación de reglas de conversión
  3. 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 cheeky). 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.

Sistemas Operativos: