Sunday, June 12, 2011

Migrando de svn a git

Este es un breve resumen de mi experiencia al migrar un repositorio de svn a git.

Documentación

Dado que donde decidí mudar mi proyecto fue Github, el primer material que consulté fue la documentación oficial de github. Allí se comenta sobre 3 formas de migrar un repositorio svn:
  • Importación Autómatica (para svn públicos): Como el proyecto era privado, no era accesible sin autenticación, no pude utilizar el importador mágico de github. Creo que para un proyecto “público” sería la mejor opción (o al menos lo que intentaría primero).
  • svn2git: No lo probé aunque suena interesante no tener que hacer los tags a mano (cosa que tuve que hacer). En un proyecto de más de 20 tags recomiendo intentar esta herramienta primero.
  • git svn: El camino que yo elegí fue utilizando ese comando y ayudado por la siguiente respuesta de stackoverflow. Si bien en github se menciona algo similar, en stack overflow está más claro el paso a paso de las operaciones a realizar.

Issues
Como no hay muchos issues involucrados en el proyecto que estoy migrando (no me interesa guardar los cerrados) los migré a mano.

Uno de los problemas que tuve fue que al asociar los usuarios de svn con los usuarios de github se volvieron a ejecutar comandos de postcommit que teníamos en la integración con trac. Razón por la cual, al haber commits con mensaje del estilo “Closes #2” y al no haber migrado adecuadamente los issues, tuve que volver a abrir tickets que fueron cerrados al interpretar incorrectamente que se debía cerrar el ticket (sobre los commits del pasado).

Otro problema que existe, es que si el ticket o issue está re abierto actualmente y en uno de los commits viejos importados lo cierra, hay que tomarse el trabajo de buscarlo y volverlo a abrir.

Por esto, recomiendo fuertemente que primero se haga la migración del repositorio y después del Trac/issues (de manera de evitar estos conflictos).

Si bien estos dos inconvenientes no fueron un problema, en un proyecto grande recomiendo fuertemente usar SD, para evitar estas situaciones que en un proyecto chico son triviales de solucionar.

SVN

Archivo de Usuarios

Lo primero que se debe hacer es escribir un archivo con la equivalencia entre los usuarios de svn y los usuarios de github. Si a priori no se recuerdan, se puede ejecutar el comando de importación (como apareec en la pregunta de github) y después ir agregandolos a medida que aparecen.

De esta forma, además de mantener el histórico de cambios también se asocia las modificaciones con las cuentas de github (si esto no se hace bien, aparecerá el registro histórico pero no se asociará a la cuenta correspondiente de github que realizó el cambio). Por esta razón, se tiene que tener el cuidado de poner exactamente el mail de la cuenta de github asociada al usuario de svn correspondiente. Teniendo ese cuidado, la asociacion se va a realizar de manera correcta. No es necesario que el gituser name (no es el username, sino el nombre completo de la persona) sea exacto al de github. El formato por cada línea del archivo de usuarios debe ser la siguiente:
svnuser = gituser_name <gituser_email>


Branches y Tags

Por suerte mi proyecto no tuvo branches, así que no tuve que preocuparme por eso.

Luego, tuve que crear los tags en base a lo que git-svn detectó. No tuve mayores problemas con esto aunque por ejemplo me aparecieron branches que no se correspondían a nada del proyecto y que finalmente terminé descartando.


Origin

Como el origin estaba mal seteado tuve que hacer:
$ git remove rm origin
y finalmente:
$ git remote add origin git@github.com:GITHUB_USERNAME/REPO_NAME.git
$ git push origin master
como señala en la documentación de github.

Capacitación de Usuarios

Otro de los aspectos a tener en cuenta es como capacitar en git. Para eso recomendé que leyeran los siguientes links (que consideré bastante completos):
Sería interesante encontrar un buen libro que resuma todo esto, pero la verdad que no tuve tiempo de evaluar cual sería el adecuado (estoy abierto a sugerencias en este aspecto).

Conclusión

Si bien la migración fue sencilla, en un proyecto grande hay que tener cuidado de realizar en orden correcto la importación (primero el código y después los issues). Para esto recomiendo utilizar: svn2git. Es importante en ese caso utilizar herramientas como SD que permiten mantener hacer una migración ordenada (habría que comprobar si permite mantener el id del issue, intuyo que si). Por último, es fundamental encontrar buena documentación de donde aprender sobre git. Buscar un buen libro del tema es una inversión dado que si los usuarios no lo adoptan y no se sienten cómodos trabajando en el sistema de versionado este se convierte en un problema que afecta el día a día.