Introducción a Subversion
Un poco de historia
Subversion es un servicio encargado de controlar el desarrollo de los distintos proyectos que se crean en una empresa de desarrollo de soft.
Este programa nace con el objetivo en mente de sustituir a CVS (Concurrent Versioning System), el cual ha sido demostrado tiene bastantes carencias y/o limitaciones.
Es un sistema de control de versiones libre. Su licencia es la Apache 1.1. Subversion se encarga de mantener un árbol histórico de ficheros y directorios a lo largo del tiempo.
Esta idea no es nueva y tampoco se está reinventando la rueda, simplemente se está mejorando. Al parecer, en el año 2000 los desarrolladores de CollabNet estaban realmente quemados por los problemas que causaba el uso de CVS (cuya idea se fraguó en 1985) en su suite de desarrollo SourceCast. Fue en ese año cuando comenzaron a buscar programadores para el diseño e implementación de Subversion con la idea en mente de mejorar CVS y sustituirlo como componente de SourceCast en favor de Subversion.
Allá por Febrero de 2000 el grupo CollabNet contactó con Karl Fogel, un hombre que llevaba años ofreciendo el servicio de CVS a empresas para controlar sus desarrollos junto a su amigo Jim Blandy. El segundo permitió al primero dedicarse enteramente al proyecto Subversion de manera indefinida.
El número de desarrolladores creció debido a que el proyecto atrajo a mucha gente que compartía los mismos deseos: mejorar CVS. Así, después de poco más de un año de programación, los desarrolladores de Subversion empezaron a usar su propio sistema en lugar de CVS, que era lo que usaban hasta ese momento.
Algunas de las características que hacen de Subversion un digno sucesor de CVS son:
- Histórico de directorios: a diferencia de CVS, la nueva implementación permite mantener un histórico de directorios creados, renombrados y/o borrados.
- Histórico real de archivos: CVS guardaba todos los cambios realizados sobre un archivo en un fichero de texto. Esto representaba un serio problema porque a la hora de, por ejemplo, crear un fichero con el nombre de otro que ya existía, se heredaba el histórico del fichero viejo aunque ya no tuvieran nada en común. Eso ha dejado de ocurrir: ahora cualquier operación que incluya copiado, renombrado, borrado o añadido tendrá su propio histórico.
- Consistencia de los datos almacenados: Subversion maneja de igual manera ficheros de texto y binarios: hace uso de un algoritmo de "diferenciación" que permite compresión de los datos dentro del repositorio y, además, se apoya en una base de datos BDB (Berkeley DB).
- Transacciones: Igual que en el banco cuando efectuamos una operación, en Subversion las modificaciones del repositorio se realizan completas o no se realizan. O se realizan todos los pasos o no se realiza ninguno. Nunca se quedará un commit a mitad.
- Modificable: Subversion ha sido diseñado de forma que cualquier modificación no conlleve demasiado esfuerzo: consiste básicamente en una serie de APIs bien definidas programadas en varias librerías compartidas.
Instalando Subversion
La instalación la he realizado sobre una distribución Gentoo Linux 2004.1 aunque los pasos imagino que serán casi los mismos en cualquier distribución. La versión del programa que he instalado ha sido la última disponible en el árbol Portage: la 1.0.2.
# emerge -s subversion
Searching...
[ Results for search key : subversion ]
[ Applications found : 1 ]
* dev-util/subversion
Latest version available: 1.0.2
Latest version installed: 1.0.2
Size of downloaded files: 5,813 kB
Homepage: http://subversion.tigris.org/
Description: A compelling replacement for CVS
License: Apache-1.1
Las dependencias que tiene Subversion dependen de las necesidades que tenga cada administrador del repositorio. En mi caso necesitaba soporte para python y también para WebDAV/DeltaV (una especificación que permite el acceso a ficheros como URLs). Dicho esto, las dependencias que yo necesité instalar fueron:
* dev-lang/swig
Latest version available: 1.3.21
Latest version installed: 1.3.21
Size of downloaded files: 1,975 kB
Homepage: http://www.swig.org
Description: Simplied Wrapper and Interface Generator
License: as-is
* net-misc/neon
Latest version available: 0.24.5
Latest version installed: 0.24.5
Size of downloaded files: 585 kB
Homepage: http://www.webdav.org/neon
Description: HTTP and WebDAV client library
License: GPL-2
Para instalar simplemente ejecuté:
# ACCEPT_KEYWORDS="~x86" emerge subversion
Y él sólo instaló las dependencias. Para el que no sepa que significa la variable pasada al programa emerge: se trata del sistema de 'enmascarado' de paquetes de Gentoo. x86 significa paquete de la rama estable y ~x86 paquete inestable.
Los paquetes tardaron en compilar (Xeon 3GHz):
# genlop -t neon swig subversion
* net-misc/neon
merge time: 37 seconds.
* dev-lang/swig
merge time: 1 minute and 11 seconds.
* dev-util/subversion
merge time: 4 minutes and 45 seconds.
Es decir, muy poco rato. No obstante se pueden obtener binarios en la web de tigris.
Algunos comandos de subversion
Veamos ahora de forma breve algunos comandos que incluye subversion.
- svn: Es el equivalente al comando 'cvs' de CVS. Es el comando que más se utiliza por todas las operaciones que permite realizar. Ejemplos:
*Listar los directorios (proyectos) de un repositorio (almacén):
# svn list --verbose file:///var/svn/repos/
13 user May 18 11:21 proyecto/
Esto nos indica la última revisión realizada (13). Quién la realizó (user). Cúando se realizó y sobre qué directorio tuvo lugar esa acción.
# svn import . http://192.168.2.2/svn/repos/proyecto --message "import inicial del proyecto" --username user --password password
Adding (bin) imagenes/mod10.swf
Adding index.htm
Committed revision 14.
Con esto hemos creado el import inicial de un proyecto.
- svnlook: comando útil que nos permite averiguar información sobre el repositorio. Ejemplo:
# svnlook history /var/svn/repos/
REVISION PATH
-------- ----
4 /
3 /
2 /
1 /
0 /
- svnadmin: herramienta para el administrador del repositorio. Nos permite crear, borrar, reparar, etc. Ejemplillos:
# svnadmin create /var/svn/repositorio
Eso nos crea el esqueleto básico de un repositorio de subversion.
# svnadmin repare /var/svn/repositorio
Nos arregla las inconsistencias del almacén de proyectos. Dependiendo del número de proyectos tardará más o menos tiempo.
- mod_dav_svn: para mí uno de los mejores componentes, permite navegación web y ver la última revisión de un proyecto. Es un navegador mínimo pero funciona bien.
- svnserve: es el componente para lanzar el demonio en 'standalone'.
Una vez vistos los componentes es hora de configurar Subversion para aceptar conexiones -al menos- vía http y poder realizar transacciones.
Configurando Subversion para aceptar conexiones WebDAV/DeltaV
En Gentoo la configuración para poder accesar a Subversion vía http es bien sencilla. Basta ejecutar el típico config de ebuild, que en el momento de confeccionar este howto es el de la versión 1.0.2:
# ebuild /var/db/pkg/dev-util/subversion-1.0.2/subversion-1.0.2.ebuild config
Eso nos crea el repositorio y ajusta el dueño y permisos a apache (que es el usuario que ejecuta el servidor web en Gentoo):
mkdir -p ${SVN_REPOS_LOC}/conf
einfo ">>> Populating repository directory ..."
# create initial repository
/usr/bin/svnadmin create ${SVN_REPOS_LOC}/repos
einfo ">>> Setting repository permissions ..."
chown -Rf apache:apache ${SVN_REPOS_LOC}/repos
chmod -Rf 755 ${SVN_REPOS_LOC}/repos
Un repositorio subversion cuenta con dos directorios, uno (conf/)para configuraciones tales como un fichero de autentificación y otro (repos/) que es el repositorio en sí. Este segundo directorio contiene lo siguiente:
# ls /var/svn/repos/
README.txt conf dav db format hooks locks
Dentro del subdirectorio conf de repos/ hallamos el fichero svnserve.cnf. Este fichero sirve para gestionar las distintas opciones que el demonio svnserve nos ofrece. Sólo es necesario configurarlo si vamos a permitir acceso usando subversion como demonio del sistema. Yo no lo uso pues prefiero acceder al repositorio vía webdav, pero un fichero svnserve.cnf mínimo debe tener, al menos:
# [general]
anon-access = none # no permitimos acceso anónimo de ningún tipo, ni lectura
auth-access = write # permisos 'blanket' (totales) para aquellos usuarios # autentificados.
password-db = passwd # fichero donde se encuentran los user/passwd si no usamos los # del sistema
realm = Repositorio Subversion #mensaje típico de bienvenida
NOTA: Permisos blanket significa que tendrá acceso de ese tipo a todos los proyectos. Por ejemplo, permiso blanket read significa que el usuario que lo tenga podrá leer el código de todos los proyectos. Esto se puede afinar pero a mi no me hace falta, por lo que no se detalla aquí. En el book de Subversion que hay en la entrada de Bibliografía podemos indagar sobre ello.
Además de esto y totalmente gratis, Paul de Vrieze (el mantenedor del paquete en Gentoo), nos provee el esqueleto básico de configuración necesaria para usar el módulo de webdav con apache:
# cat /etc/apache2/conf/modules.d/47_mod_dav_svn.conf
<IfDefine SVN>
<IfModule !mod_dav_svn.c>
LoadModule dav_svn_module extramodules/mod_dav_svn.so
</IfModule>
<Location /svn/repos>
DAV svn
SVNPath /var/svn/repos
AuthType Basic
# AuthName "Subversion repository"
AuthName "Repositorio Subversion"
AuthUserFile /var/svn/conf/svnusers
Require valid-user
</Location>
</IfDefine>
SVNPath es la ruta completa al repositorio en el sistema de archivos (Location es como si fuera un ScriptAlias, crea una URL 'virtual' para acceder al contenido de otro directorio).
AuthUserFile es el equivalente al fichero 'passwd' en un svnserve.cnf normal y corriente. Contiene un usuario y passwd por línea. Es recomendable cifrar las contraseñas con MD5 cuando usemos htpasswd2 para crear usuarios:
# htpasswd2 -m /var/svn/conf/svnusers user
Eso nos creará un usuario con login user y nos pedirá un password que será cifrado en el fichero svnusers. Si el fichero no está creado hemos de añadir la opción -c.
Una vez añadido un usuario sólo nos falta arrancar apache con un par de opciones, así que para ello vamos al fichero /etc/conf.d/apache2 y a la línea APACHE_OPTS le añadimos:
-D DAV -D SVN.
Reiniciamos Apache y ya deberíamos tener acceso al repositorio mediante la url http://servidor/svn/repos/
Eso sí, como aún no tenemos alojado ningún proyecto, veremos el repositorio vacío.
Ya que estamos, vamos a crear un proyecto ahora:
# cd proyecto
# svn import . http://servidor/svn/repos/proyecto --username user --password password --message "Import inicial"
Adding config.php
Adding index.php
Adding consulta.php
Committed revision 15.
proyecto #
Listo, ahora si volvemos a navegar a la URL de antes sí veremos el proyecto listado y podremos navegar por la última revisión. ¡Un momento! ¿Sólo por la última revisión? Sí, el navegador que incorpora el módulo de webdav de subversion es mínimo y sólo ofrece esa posibilidad. Es aquí donde entra en juego...
VIEWCVS
ViewCVS es una de las aplicaciones más útiles y más conocidas para navegar por un repositorio. Aunque su nombre engaña a día de hoy es posible usar ViewCVS para ver el contenido de un repositorio Subversion. Podemos verlo en funcionamiento en el propio SourceForge (sirviendo de acceso a su CVS).
La instalación de ViewCVS en Gentoo es muy sencilla e imagino que será prácticamente igual en todas las distribuciones. Se trata de instalar los cgis y configurarlos:
# emerge viewcvs
Y luego editamos /etc/viewcvs/viewcvs.conf para reflejar nuestra configuración:
# $EDITOR /etc/viewcvs/viewcvs.conf
svn_roots = svn : /var/svn/repos
svn_parent_path = /var/svn
default_root = svn
main_title = Repositorio Subversion
forbbiden = example
languages = es-es
Si vamos a usar BD también tendremos que tocar:
host =
database_name = ViewCVS
user =
passwd =
Ahora sólo nos faltaría añadir un virtual host de este estilo a apache:
<VirtualHost *:80>
DocumentRoot /var/www/localhost/htdocs/viewcvs
ServerName viewcvs.servidor.com
TransferLog /var/log/apache2/viewcvs_access.log
ErrorLog /var/log/apache2/viewcvs_error.log
ScriptAlias /cgi-bin/ /var/www/localhost/htdocs/viewcvs/cgi/
<Directory /var/www/localhost/htdocs/viewcvs/cgi/>
Options +ExecCGI
</Directory>
</VirtualHost>
Y ya podríamos navegar por él viendo todas las versiones como en un CVS normal y corriente ;-)
Supongamos que hemos visto una aplicación que nos interesa y todavía no han sacado un tar. En ese caso si queremos bajarnos la última revisión del código deberemos usar el comando 'cvs' pasándole la opción 'checkout':
$ svn checkout http://servidor/svn/repos/proyecto
En este momento es cuando los programadores vagos de mi curro dicen..."¿voy a tener que ejecutar eso cada vez?" A lo que yo respondo: "osi tu eres un vago, necesitas RapidSVN".
RapidSVN
Es el GUI ideal para programadores. Podemos ver unas cuantas screenshots. Al utilizar WxWindows se puede instalar en Windows, Linux u otros SOs.
La instalación en Gentoo es trivial: emerge rapidsvn y ya está. No requiere ningún tipo de configuración. La URL para descargar la version para Windows es esta.
TortoiseCVS
Este módulo viene genial para los programadores de Windows: se instala y permite navegar desde el explorador de archivos por un proyecto. La URL para más información es esta.
Y con esto termina esta breve introducción a Subversion.
Bibliografía
http://svnbook.red-bean.com/ : Fundamental, es la biblia de Subversion.