28 Feb 2017

Introducción a Subversion

Repasamos uno de los sistemas más habituales de control de versiones, Subversion y asi entendemos que motivos nos llevan a escogerlo

En el capítulo anterior vimos los conceptos principales de un control de versiones. Ahora vamos a ver algunos de los sistemas más habituales y como resuelven las diferentes formas de trabajar vistas hasta ahora y los motivos que nos pueden conducir a escoger uno u otro sistema.

Aunque existen una larga lista de herramientas de control de versiones, yo me voy a centrar solo en los que personalmente he considerado más interesantes:

  • Subversion
  • GIT
  • Mercurial

Los iremos viendo en diferentes entradas. Hoy empezamos por el primero Subversion.

Subversion

Este sistema tiene una característica especial que lo diferencia de otros sistemas y es que no tiene una herramienta concreta para definir una rama (branch) o etiqueta (tag).  Subversion sólo hace una cosa y lo hace muy bien, maneja versiones de ficheros dentro de una carpeta.

En un repositorio de Subversion solo vemos carpetas y ficheros, las ramas se gestionan como carpetas, al igual que las etiquetas.  Por entender el concepto, trabajamos igual que hacíamos en nuestro ejemplo inicial en el que cada vez que decidíamos que hemos terminado una versión, copiábamos la carpeta completa a una ubicación diferente. SVN propone una forma simple de hacer esto mismo.

Su base de datos interna guarda el registro de cambios de todos los ficheros y carpetas, en cualquier momento podemos “copiar” una carpeta a una ruta diferente sin coste de espacio en el repositorio. Hacer esto usando carpetas normales resulta en un aumento de espacio en disco, en SVN la operación es normal y solo implica una entrada en la base de datos.

Otra característica importante de SVN es que se considera un sistema “centralizado”. Esto significa que el repositorio está sólo en una ubicación y el acceso al código y al histórico se concede a través del acceso a este repositorio usando alguno de los protocolos soportados.

Voy a explicar este punto con un ejemplo usando los comandos de creación de SVN.

Asumimos que queremos instalado SVN en nuestra máquina (¿no lo tienes?  No te preocupes, lo que vamos a ver es orientativo, aunque instalarlo es muy fácil)

Si ejecutamos un comando como:

E:
mkdir svn
cd svn

svnadmin create programando

Nos ha creado un repositorio en una carpeta “programando”. Ahora podemos usar este repositorio para ir almacenando nuestros cambios. Si queremos ver el contenido de esta carpeta hay 2 ficheros y 4 carpetas.

  • txt → Instrucciones de uso, básicamente un “no lo uses”. Casi todas las operaciones en esta carpeta deben de hacerse usando comandos svn o svnadmin.
  • CONF → Configuración del repositorio, como he dicho antes, no deberíamos de modificar directamente, aquí van las autorizaciones y permisos.
  • DB → la base de datos de cambios
  • Hooks→ scripts para hooks, no voy a extenderme, pero para que lo sepas, son scripts que se pueden ejecutar por cada operación en el repositorio.
  • Locks→ para gestionar los bloqueos de fichero.

Como ves, este repositorio no se usa tal y como está, si no que se opera a través del comando “svn”. Para trabajar con él, vamos a crear una carpeta de trabajo e indicarle que use esta ruta para almacenar los cambios. Como nosotros hemos creado en local y no vamos a usar ninguna red emplearemos el protocolo más básico, “file”.

Vamos a hacer nuestra primera revisión de código de nuestro proyecto “Super Tienda”. El comando es al como:

svn URL PATH

 

Que para nuestro caso va a ser:

cd E:\
mkdir workspace

svn co file:///E:/svn/programando E:\workspace\miproyecto

 

Con esta operación acabamos de bajarnos el estado actual del repositorio y como nos indica el mensaje, estamos en la revisión 0.
Como no quiero convertir esto en un tutorial de Subversion (deja en los comentarios si queréis uno más extenso), prefiero es que entiendas que en este punto tenemos dos elementos, el repositorio (E:\SVN\programando)  Y nuestra carpeta de trabajo (E:\worspace\miproyecto).
Si en lugar de usar el protocolo FILE quiero usar el más común http, necesito configurar un servidor web para que el haga de interfaz entre el repositorio y el cliente. Pero eso es parte de otro tema.

Usando Ramas y etiquetas

Ya adelanté que en Subversion el concepto de ramas y etiquetas no está totalmente definido si no que se usa una convención de nombres de carpetas, al igual que hicimos nosotros en nuestro sistema local de carpetas. Así que estrictamente hablando puedes gestionarlo usando los nombres y de la manera que más te apetezca, simplemente ten en cuenta que las convenciones están para algo y si alguien nuevo se incorpora a tu proyecto, usando las convenciones le resultará más fácil entender la forma de trabajar.

Esta convención de la que estoy hablando es que un TAG es una “carpeta” con ese nombre. El contenido de dicha carpeta nunca se modifica una vez creada, con las ramas sí se puede modificar el contenido, puesto que para eso son las ramas, se crean a partir de la rama principal o de otra rama en una carpeta “ramas” (branches en inglés).

Para que se entienda un poco mejor, el comando para crear una rama o un tag es el mismo, el comando “copy”:

svn copy file:///E:/SVN/SuperTiendaRepo/trunk file:///E:/SVN/SuperTiendaRepo/tags/3.0.1 -m "Version 3.0.1"

 

Este comando está creando el TAG desde Trunk, y serviría también para un BRANCH.

ATENCION: ¡Ahora es el momento de abrir la carpeta de nuestro repositorio (E:\SVN\SuperTiendaRepo) y descubrir que la carpeta TRUNK y TAGS no existe! Sin embargo, el comando ha funcionado, esto es porque realmente está usando la información que existe en su base datos de la estructura de las carpetas y no las carpetas como tal.

La principal ventaja de SVN es su “sencillez”, es fácil de entender y de manejar, la gestión de permisos es muy cómoda y se puede delegar en herramientas más avanzadas, se puede instalar con un servidor web como apache y por lo tanto soportar el protocolo HTTP (Webdav para ser más exactos). Como principal inconveniente es que no es especialmente cómodo para la gestión de mezcla de cambios, el proceso se vuelve un poco farragoso y propenso a errores.

Si quieres aprender todas las funcionalidades de subversión puedes encontrar excelentes manuales por internet, a mí personalmente me ha gustado mucho el manual de TortoiseSVN, un excelente cliente muy visual para Windows.

Otros conceptos.

Para terminar, quiero comentar un par de conceptos más allá de las ramas y los tags. Hasta ahora me he centrado solo en esto porque estamos haciendo una evolución suave desde la gestión de carpetas a mano a un sistema de control de versiones como Subversion. Pero existen muchos otros conceptos que involucran usar el comando svn que son importantes de conocer.

Uno de ellos es el “COMMIT”, a nivel conceptual este comando es el equivalente a guardar de cualquier programa que puedas encontrar (la traducción al inglés es “cometer” o mejor “confiar”, le confiamos al repositorio el cambio que hemos hecho), otro es ADD que añade un fichero al repositorio, DELETE que borra , REVERT deshace un cambio o MERGE que permite reintegrar o combinar el cambio entre dos ramas.

Como cualquier otra herramienta hay muchas cosas que debes aprender para dominarla, pero no es el objetivo de este post. Si tienes más interés, deja un comentario sobre lo que quieres saber y en el futuro intentaré ayudarte en la medida de lo posible.