Para participar en el VI Concurso Universitario de Software Libre es necesario trabajar en la forja de RedIRIS, que utiliza el sistema de control de versiones Subversion (SVN).
Este requisito facilita la supervisión de los proyectos por parte de la organización y no supone ningún problema para los proyectos que parten de cero, pero para los proyectos ya existentes que se presentan al concurso y que ya liberaron su código en su momento puede suponer un problema, pues ya tienen su propia forja.
Este último es el caso de SWADroid, cuyo código fuente fue publicado en la forja de GitHub, que utiliza el sistema de control de versiones Git, en el mismo momento en que comenzó su desarrollo.
Dado que la intención de SWADroid es seguir utilizando la forja de GitHub tal y como ha venido haciendo hasta ahora y dejar la forja de RedIRIS únicamente para su participación en el CUSL, durante el desarrollo del concurso será necesario publicar los cambios en ambas forjas de forma simultánea.
Aquí es donde entra en juego git-svn.
git-svn es un componente de Git que ejerce de puente entre éste y SVN. Se utiliza principalmente para trabajar de forma local con Git y subir los cambios a un servidor remoto que utilice SVN y para realizar migraciones entre ambos sistemas.
La forja de RedIRIS se proporciona totalmente vacía, sin ninguna estructura de directorios, por lo que el primer paso es crear la estructura básica estándar de un repositorio SVN:
- Crear un directorio temporal vacío en el que se inicializará el repositorio SVN: mkdir rediris
- cd rediris
- Crear la estructura básica estándar de un repositorio SVN: mkdir branches tags trunk
- Subir los cambios a la forja de RedIRIS: svn commit -m «Create repository structure»
- Borrar el directorio rediris, pues ya no se necesitará más.
Para enlazar las dos forjas de SWADroid se han dado los siguientes pasos:
- Crear un directorio vacío en el que se inicializará la copia local de trabajo: mkdir cusl6-swadroid
- cd cusl6-swadroid
- Clonar el repositorio SVN ya inicializado en el repositorio Git: git svn clone –username NOMBRE_DESARROLLADOR –stdlayout https://forja.rediris.es/svn/cusl6-swadroid/trunk .
- Añadir la forja de GitHub como origen remoto: git remote add origin git@github.com:Amab/SWADroid.git
- Obtener la información del origen remoto, este paso creará las ramas remotas necesarias para el siguiente paso: git fetch origin
- Crear la rama local de desarrollo enlazándola con la rama remota de desarrollo: git checkout -b develop origin/develop
- Subir los cambios a la forja de RedIRIS: git svn dcommit
NOTA: Subir los cambios a la forja de RedIRIS puede tardar mucho tiempo, ya que git-svn recrea todo el historial de cambios realizando todos los commits en SVN uno a uno y el protocolo utilizado por SVN es bastante lento, por lo que si hay muchos commits el proceso será largo.
En este momento ya estará lista la copia local de trabajo, que estará enlazada tanto con la forja de GitHub como con la forja de RedIRIS. Además, la forja de RedIRIS contendrá una copia exacta del historial de cambios, ya que se han recreado todos los commits del repositorio original con sus respectivos mensajes.
Lo único que no se habrá recreado son los nombres de los autores de cada commit, ya que mientras que Git utiliza el nombre y la dirección de correo electrónico, SVN sólo utiliza el nombre. Al utilizar sistemas distintos para referenciar a los autores de los commits, la migración efectiva de dichas referencias entre ambos sistemas de control de versiones es una tarea muy complicada.
Una vez preparada la copia local de trabajo, el flujo de trabajo diario es el siguiente:
- Obtener los últimos cambios de la forja de GitHub: git pull origin develop
- Obtener los últimos cambios desde la forja de RedIRIS e integrarlos en la copia local de trabajo: git svn rebase
- Continuar el desarrollo y realizar los commits necesarios en Git.
- Subir los cambios realizados a la forja de RedIRIS: git svn dcommit
- Subir los cambios realizados a la forja de GitHub: git push origin develop
Como se puede ver, el flujo de trabajo no difiere demasiado del que se utilizaría si sólo se trabajara con Git, puesto que para trabajar con ambas forjas de forma simultánea sólo hay que realizar dos pasos adicionales: obtener e integrar los últimos cambios de la forja de RedIRIS al principio y subir los cambios realizados al final.
Un detalle a tener en cuenta a la hora de ejecutar el comando git svn dcommit para subir los cambios a la forja de RedIRIS es que éste sólo tendrá éxito si no hay ningún cambio pendiente de commit en Git. La ejecución del comando git push origin develop para subir los cambios a la forja de GitHub no tiene este problema, pues sube únicamente los cambios a los que se haya realizado commit.