Git Svn - Importar de Subversion a Git - Más allá de lo que ves

sábado, 4 de enero de 2014

Git Svn - Importar de Subversion a Git

Para importar un proyecto que consta de diferentes módulos con código en Subversion a un único proyecto en Git, lo primero que haremos será pasar cada uno de los módulos de Subversion a Git con su histórico particular de commits. Esta parte es muy muy muy sencilla y será lo que veremos en esta entrada.

Mapeo de usuarios Subversion y Git

Lo primero que debemos hacer es crear un fichero para mapear los usuarios de Subversion con los usuarios que vamos a tener en Git. En Subversion los usuarios se definen con un nombre de usuario pero en Git debemos definir un nombre y una dirección de correo.

Nuestro fichero debe tener el siguiente formato:
usuario-svn-1 = Javier Montesinos <fj.montesinos@gmail.com>
usuario-svn-2 = Nombre Apellidos <nombre.apellidos@gmail.com>

De tal forma que debemos añadir tantos usuarios de Subversion al fichero de mapeo como usuarios hayan realizado commits en los proyectos que deseamos migrar a Git. De todos modos no te preocupes porque Git te avisará si al realizar la importación encuentra un usuario que no está en el fichero de mapeo, lo añades y volverías a ejecutar el proceso de importación. 

Una vez tenemos el fichero usuarios-svn.txt finalizado y ubicado por ejemplo en la siguiente ruta /git-learning/common/users-svn.txt lo siguiente que tenemos que realizar es importar el proyecto de Subversion a Git

Importar proyecto de Subversion a Git 

Supongamos que tenemos un proyecto padre con el nombre Mi Aplicación que consta de dos módulos la parte web, mi-aplicacion-wm y el modelo, mi-aplicacion-model-jm donde tenemos definido servicios, dominio, capa de acceso a datos para que en el caso de necesitar realizar una capa de servicios REST tan solo debamos implementar la parte REST mediante mi-aplicacion-restm.

Además tenemos en Subversion lo siguiente:

mi-aplicacion-wm → http://svn.montesinos.org.es/trunk/mi-aplicacion-wm
mi-aplicacion-model-jm → http://svn.montesinos.org.es/trunk/mi-aplicacion-model-jm

Para importar mi-aplicacion-wm desde consola ejecutaremos lo siguiente:

$ git svn clone http://svn.montesinos.com/trunk/mi-aplicacion-wm \
--authors-file=/git-learning/common/users-svn.txt \
--no-metadata mi-carpeta-aplicacion-wm

Mediante el atributo --no-metada evitaremos que git nos añada información a cada uno de los commit como la que se muestra a continuación y nos quedaría con el mensaje del commit limpio:

git-svn-id: http://svn.montesinos.com/trunk/mi-aplicacion-wm@94 4c93b258-373f-11de-be05-5f7a86268029

El atributo mi-carpeta-aplicacion-wm indica la carpeta en la cual queremos que se realice la importación, así pues si por ejemplo ejecutamos el comando git svn desde /git-learning/projects/mi-aplicacion se creará la carpeta /git-learning/projects/mi-aplicacion/mi-carpeta-aplicacion-wm y en esta tendremos finalmente nuestro código procedente de Subversion y la carpeta .git con toda la información de los commits relacionados con el proyecto procedentes de Subversion. 

Para realizar lo mismo con mi-aplicacion-model-jm ejecutaríamos:

$ git svn clone http://svn.montesinos.com/trunk/mi-aplicacion-model-jm \
--authors-file=/git-learning/common/users-svn.txt \
--no-metadata mi-aplicacion-model-jm


Publicar los cambios en un repositorio remoto

Para publicar el código en un repositorio remoto tenemos diferentes opciones Github, Bitbucket... pero si queremos que nuestro código resida en nuestros servidores de forma algo más "privada" podemos optar por una solución como GitLab tremendamente sencilla de utilizar y configurar y mediante la stack de Bitnami rapidísima de echar a rodar.

Desde Gitlab crearemos 2 proyectos: mi-aplicacion-wm y mi-aplicacion-model-jm cuyas urls serán por ejemplo:

mi-aplicacion-wm → http://gitlab.montesinos.org.es/javier-montesinos/mi-aplicacion-wm.git
mi-aplicacion-model-jm → http://gitlab.montesinos.org.es/javier-montesinos/mi-aplicacion-model-jm.git

Tan solo nos queda pues hacer push de nuestro código a los repositorios remotos. Para mi-aplicacion-wm, desde la carpeta ../mi-aplicacion/mi-aplicacion-wm publicamos en el repositorio remoto ejecutando lo siguiente:

$ git remote add origin \
http://gitlab.montesinos.org.es/javier-montesinos/mi-aplicacion-wm.git
$ git push -u origin master

Para mi-aplicacion-model-jm y desde ../mi-aplicacion/mi-aplicacion-model-jm ejecutamos:

$ git remote add origin \
http://gitlab.montesinos.org.es/javier-montesinos/mi-aplicacion-model-jm.git
$ git push -u origin master

El siguiente paso será integrar ambos proyectos en un único repositorio, pero esto es harina de la siguiente entrada.

Referencias

Entrada en formato pdf: Git Svn - Importar de Subversion a Git
Libro Pro Git - Capítulo 8 - Git y Subversion

Saludos.

P.D. Como siempre espero que pueda ser útil.


Siguiente entrada publicada -> Git - Merge de dos repositorios en uno

3 comentarios:

  1. Una cosa que he descubierto.

    Si nos interera obtener el código de Subversion desde una revisión concreta no tendremos más que usar los parámetros -rN:HEAD justo después del clone. Donde N será la revisión desde la que deseamos importar nuestro repositiorio.

    Así pues para importar desde la revisión 100 por ejemplo usaríamos:

    git svn clone -r100:HEAD ....

    ResponderEliminar
  2. Buenísimo Javier justo lo que andaba buscando

    ResponderEliminar
  3. Me alegro que te pueda ser útil Milton.

    Una cosa que se nos ha dado realizando importaciones en otros equipos. Si necesitásemos especificar el usuario de Subversion para realizar la importación habría que añadir lo siguiente --username=usuario-svn después de clone de modo que nos quedaría:

    $ git svn clone --username=miusuario-svn ....

    ResponderEliminar