Migración SVN a Git En ocasiones los equipos empiezan a desarrollar código y utilizan para la gestión del código SVN ya que es lo que se ha venido utilizando desde hace tiempo. Con la aparición de Git esto ha cambiado, puesto que Git entre otras características permite realizar commits offline. Figura X: Git y Subversion. Ahora comentaré las ventajas de uno y otro sistema de control de versiones. Git ha convertido en el estándar de la industria en el desarrollo web, se prefiere a diferencia de SVN porque: Git se distribuye. Git es más rápido. Git tiene un tamaño más pequeño por repositorio. Generar ramas y trabajar con los equipos es más fácil. SVN ha sido utilizado por más tiempo, hay herramientas de interfaz de usuario más gráfica, si se quiere evitar la línea de comandos. Hay, sin embargo, un montón de herramientas de Git, así que esto no debería ser un gran motivo de ruptura. SVN es un sistema de control de versiones centralizado, todo se almacena en un solo lugar. Esto puede hacer que algunos piensan que SVN es menos confuso que Git. En nuestro caso nos decidimos por Git después de tener el repositorio de código en SVN porque: Git es mucho más rápido que Subversion SVN requiere 30 veces más el espacio en disco para almacenar el mismo historial. Las ramas Git son más simples que en Subversion. Las ramas Git llevan toda su historia completa GitHub provee una comunidad entorno a Git muy grande y con muchas características interesantes. Nosotros hemos utilizado para realizar la migración Subgit, que es una herramienta que mantiene sincronizados dos repositorios de SVN y Git, de tal modo que cuando se hace un cambio en alguno de estos dos repositorios, SubGit replica el cambio en el otro repositorio. Su propósito es proporcionar un camino de migración gradual de SVN a Git, ya que permitiría que gradualmente los desarrolladores vayan usando funcionalidad de Git cada uno a su ritmo, pudiendo algunos estar ya trabajando completamente sobre Git mientras que otros continúan trabajando contra el repositorio de SVN. Figura X: Ciclo de vida con la herramienta Subgit. La potencia de Subgit reside en la capacidad de adaptación que tiene para migrar cualquier repositorio SVN a Git. Para ello nos brinda una serie de archivos de configuración que paso a comentar. repositorio_git/subgit/config: en este archivo tenemos la URL del repositorio SVN así como el mapeo que se va a realizar entre las ramas que existen en SVN y Git. Además contiene una referencia al archivo donde se encuentra el nombre de los autores de los commits en SVN. [core] authorsFile = subgit/authors.txt pathEncoding = UTF-8 defaultDomain = tmatesoft.com [svn] url = http://egc-frontend-resultados.googlecode.com/svn/ trunk = trunk:refs/heads/master branches = branches/*:refs/heads/* tags = tags/*:refs/tags/* shelves = shelves/*:refs/shelves/* fetchInterval = 60 connectTimeout = 30 readTimeout = 60 auth = default [auth "default"] passwords = subgit/passwd useDefaultSubversionConfigurationDirectory = false subversionConfigurationDirectory = /home/user/subversion repositorio_git/subgit/authors.txt: es donde se encuentran los autores de los commits en SVN, y que es necesario si queremos hacer una migración consistente entre los sistemas gestores de versiones. Los pasos seguidos han sido los siguientes: En primer lugar nos descargamos de la página de Atlassian (https://bitbucket.org/atlassian/svn-migration-scripts/downloads/svn-migrationscripts.jar) es herramienta que tiene empaquetado un script para generar el archivo authors.txt y que realiza el mapeo entre los autores de SVN y Git. Un punto fuerte de este script es que no tienes porque tener el repositorio SVN en local ya que accede de manera remota y extrae los autores. Una vez la tenemos descargada procedemos a su verificación para ver que es consistente. java -jar svn-migration-scripts.jar verify Figura X: Resultado de ejecutar la verificación Después ejecutamos el script para generar los autores. java -jar svn-migration-scripts.jar authors http://egc-frontendresultados.googlecode.com/svn/ > authors.txt Figura X: Resultado de ejecutar el script de creación de autores En la carpeta de destino deberíamos tener un fichero llamado authors.txt con el mapeo. Figura X: Fichero authors.txt generado También existe una instrucción que nos saca de nuestro repositorio SVN los autores de los commits, el pega es que debemos tener ese repositorio SVN en local. svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' El siguiente paso fue lanzar el script que no permite importar nuestro repositorio SVN en la nube a nuestro repositorio Git local. Para ello utilizamos el siguiente comando: subgit import --non-interactive --svn-url http://egc-frontendresultados.googlecode.com/svn/ egcFrontend.git Acto seguido nos aparece en pantalla el progreso. Figura X: Resultado de ejecutar subgit import (progreso) Al finalizar la importación a nuestro repositorio local de Git, la consola nos mostrar una pequeña información sobre cómo ha ido el proceso. Figura X: Resultado de ejecutar subgit import Siempre es bueno comprobar que nuestro repositorio contiene la misma información y que no se ha perdido nada en el proceso. Utilizaremos git están las ramas. log –oneline para mostrar los commits y git branch para ver que Figura X: Resultado de ejecutar git log --oneline Figura X: Resultado de ejecutar git branch El proceso no ha finalizado puesto que el repositorio SVN migrado está en nuestro repositorio local Git pero a fin de que esta información sea compartida la subiremos al repositorio remoto que hay en GitHub. Para ello creamos un repositorio en GitHub y los siguiente que haremos será ejecutar el siguiente comando: git remote add origin https://github.com/alvfergar/migracionFrontend.git Figura X: Resultado de vincular el repositorio local al remoto Lo lógico después de realizar este vínculo es realizar un push a fin de la migración llegue a un punto accesible por los demás usuario, en nuestro caso el repositorio en GitHub. Lanzamos el siguiente comando: git push –u origin master Figura X: Resultado de ejecutar git push Cuando finaliza el proceso la consola mostrará Figura X: Finalización de la ejecución de git push Ahora podemos ir a la página de GitHub ya que los cambios se ven de manera mucho más atractiva. Figura X: Repositorio migracionFrontend en GitHub Para ver que el histórico de commits se ha importado correctamente y junto con sus autores. Pulsamos sobre la pestaña commits y nos sale la información asociada a los commits de nuestro proyecto migrado. Figura X: Muestra de los commits en GitHub Ejercicio 1 Migración rápida y sin necesidad de ordenador de un proyecto en SVN a Git. Nuestro Jefe nos pide que realicemos una migración de un repositorio SVN a Git. Nos comenta que lo necesita para dentro de 10 minutos ya que es el plazo máximo para poder llevarles a los accionistas una versión preliminar en desarrollo. No sería complicado de hacer salvo porque no estamos ante un ordenador. Resolución Una solución rápida para este problema es utilizar el navegador web de nuestro móvil, entrar en la página de GitHub y habilitamos la versión de escritorio de la página web y creamos un repositorio vacío. En nuestro caso se llamará migracionSVN-GIT. Figura X: Creación de un repositorio en GitHub Pulsamos sobre el último botón que dice “Import code” y nos dirigirá a la siguiente pantalla. En la cual introducimos la URL del repositorio SVN. Figura X: Proceso de migración en GitHub, añadiendo URL SVN Pulsamos sobre “Begin Import” y comienza la migración. Figura X: Proceso de migración en GitHub, progreso. Una vez finalizada la migración nos saldrá algo así, pulsamos sobre “Continue to repository”. Figura X: Finalización del proceso de migración en GitHub Entramos en nuestro repositorio migracionSVN-GIT y podemos ver que nuestro proyecto está migrado. La única pega es que solo guarda los commits referidos a creación de branches o merges. Tampoco guarda a los autores de los cambios como contributores. Figura X: Repositorio migracionSVN-GIT en GitHub Vemos los commits que se han realizado y su información. Figura X: Muestra los commits migrados desde SVN a GitHub Para finalizar le mandamos a nuestro Jefe un correo donde le damos la URL del repositorio en GitHub para que pueda hacer la presentación. Bibliografía https://blog.infranetworking.com/subversion-vs-git/ http://www.javahispano.org/portada/2012/7/17/subgit-migracion-gradual-de-svn-agit.html http://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git https://gist.github.com/leftclickben/322b7a3042cbe97ed2af https://www.atlassian.com/git/tutorials/migrating-overview/ http://www.subgit.com/documentation.html