Ramas con Subversion

De ChuWiki

Cuando tenemos lista para entragar una versión de nuestro proyecto, pero vamos a seguir desarrollando, conviene hacer una copia con los fuentes de la versión que se va a entregar, mientras seguimos trabajando en el original. Si luego, en la versión entregada salen fallos, se corrigen sobre la copia, de forma que todo el código nuevo que hemos estado haciendo no nos afecta.

Subversion nos facilita esta tarea. Con Subversion podemos hacer fácilmente estas copias dentro del repositorio, para luego elegir sobre cual de las copias trabajamos. Aunque en Subversion no existe el concepto de rama o de etiqueta para una versión, estas copias que permite hacer hacen las veces.

Puesto que para Subversion una rama es una copia, deberíamos pensar la estructura de directorios de nuestro repositorio para que tenga un sitio donde hacer esas copias y un hueco donde dejar la rama principal de trabajo. Podemos organizarlo como queramos, pero si C:\REPOSITORIO es el directorio de nuestro repositorio, una posible organización es esta

C:\REPOSITORIO
C:\REPOSITORIO\PROYECTO
C:\REPOSITORIO\PROYECTO\PRINCIPAL
C:\REPOSITORIO\PROYECTO\RAMAS\1.0
C:\REPOSITORIO\PROYECTO\RAMAS\2.0

De esta forma, debajo de C:\REPOSITORIO\PROYECTO\PRINCIPAL iría nuestra rama principal de desarrollo. Cuando queramos crear una copia, la meteríamos en C:\REPOSITORIO\PROYECTO\RAMAS\x.x dándole un nuevo número de versión x.x

Insisto, esta una posible organización que se me ha ocurrido. Cada uno puede hacerla como quiera. De todas formas, lo habitual suele ser algo como esto (por supuesto, en inglés)

c:\REPOSITORIO
c:\REPOSITORIO\trunk
c:\REPOSITORIO\branches
c:\REPOSITORIO\tags

donde trunk es la rama principal de desarrollo, branches es para las ramas y tags para etiquetas, aunque al final todo se hace a base de copiar desde la trunk.

Sacar la rama principal de Subversion[editar]

Para sacar la rama principal de Subversion y trabajar en ella ejecutamos svn checkout o lo que es lo mismo svn co

svn co file:///C:/REPOSITORIO/PROYECTO/PRINCIPAL PROYECTO

Esto nos crea un directorio PROYECTO y nos saca todo lo que hay por debajo de C:\REPOSITORIO\PROYECTO\PRINCIPAL. Con esto tenemos la rama principal sacada y dispuesta para trabajar.


Sacar una rama secundaria de Subversion[editar]

Si queremos, por ejemplo, la rama 1.0 para trabajar, podemos sacarla así

svn co file:///C:/REPOSITORIO/PROYECTO/RAMAS/1.0 PROYECTO-1.0

Esto nos creará un directorio PROYECTO-1.0 y meterá dentro todo lo que hay debajo de C:\REPOSITORIO\PROYECTO\RAMAS\1.0, es decir, la versión 1.0


Crear una nueva rama con Subversion[editar]

Para crear la rama hay que hacer la copia. Para ello hay que usar el comando svn copy. Este comando no hace una copia real, sino que eimplemente "enlaza" los ficheros en la nueva rama apuntando a la original, de forma que aunque parezca que hay dos ficheros, en realidad sólo hay uno. De hecho, el fichero copia mantiene la historia del original. Subversion sólo hará una copia real del fichero cuando este se modifique en una rama y no en la otra.

La copia se puede hacer en nuestro directorio de trabajo con svn copy o bien, lo que es más cómodo y eficiente, directamente en el respositorio con el mismo comando.

Si lo hacemos en nuestra carpeta de trabajo, nosotros sí tendremos una copia real de ambas cosas, además de estar obligados a tener sacado el repositorio por encima de los subdirectorios PRINCIPAL y RAMAS.

svn co file:///C:/REPOSITORIO/PROYECTO PROYECTO
cd PROYECTO
svn copy PRINCIPAL RAMAS/x.x
svn commit -m"creada rama x.x" RAMAS/x.x

Los comandos anteriores crean un directorio PROYECTO y ahí sacan el contenido del repositorio desde C:/REPOSITORIO/PROYECTO hacia abajo. Luego nos metemos en el PROYECTO y copiamos la rama PRINCIPAL en RAMAS/x.x. Finalmente, debemos hacer un svn commit para meter la nueva rama en el respositorio.

La otra opción, más cómoda, es hacerlo directamente sobre el respositorio. De esta forma no tenemos que sacar nada en nuestro disco de trabajo. Para ello

svn copy file:///C:/REPOSITORIO/PROYECTO/PRINCIPAL file:///C:/REPOSITORIO/PROYECTO/RAMAS/x.x

Eso hace la copia directamente en el repositorio, por no que no necesitamos hacer el svn commit. Ni siquiera necesitamos tener el proyecto sacado.


Enlaces externos[editar]