SVN es un sistema de control de versiones que está reemplazando desde hace tiempo a CVS. Ambos sistemas de control de versiones son muy útiles (y más que recomendables) para mantener centralizado y coordinado cualquier desarrollo entre varias personas o varios lugares, tanto para código como para documentación.

En su momento –the good old times– tenía repositorios CVS por todas partes y lo usaba extensivamente para mantener mis prácticas de programación, informes de prácticas en varios formatos y diversos proyectos de documentación y Software Libre. Aún conservo un repositorio CVS dentro del pendrive, pues SVN no está siempre disponible.

Hace un par de años escribí un artículo en el antiguo foro de la ETSII sobre Cómo no suicidarte si te cargas una práctica, con las instrucciones para tener un repositorio CVS en cualquier sistema en el que tengas acceso por SSH. Desgraciadamente este artículo se perdió junto con el resto del foro y no conservo copia.

Esta mañana, durante mi tercer intento accidentado de meter un proyecto en un repositorio SVN, me he tomado el tiempo de anotar aquí cómo hacerlo de la forma más portable que he encontrado: en una cuenta con acceso SSH. El método es prácticamente el mismo que en aquel difunto artículo, pero las herramientas de SVN tienen un uso y funcionamiento muy distinto al de las de CVS.

Para implementar esta receta se necesitan los siguientes ingredientes:

  • Un sistema remoto con SVN instalado. En Debian es el paquete subversion.
  • Una cuenta de usuario con acceso SSH a ese sistema remoto.
  • Un directorio personal para esa cuenta de usuario donde los ficheros se conserven. Un scratch probablemente no sirva por ser perecedero.

Lo primero que hay que hacer es crear el repositorio. El respositorio SVN es un directorio con un contenido especial, que se crea con el comando svnadmin. Si este comando está disponible en la máquina remota, puedes entrar por SSH y crear el repositorio:

$ svnadmin create $HOME/svn

Esto crea el directorio $HOME/svn con un repositorio SVN vacío.

Si el comando svnadmin no está disponible en la máquina remota –como sucede en la ETSII– puedes crear el repositorio en tu máquina local y luego copiarlo por SSH:

$ cd /tmp
$ svnadmin create svn
$ scp -r svn/ alu3096@exthost.etsii.ull.es:

De todas formas, si en la máquina remota no está disponible el programa servidor de SVN (svnserve) –como sucede en la ETSII– esto no servirá de mucho, pues sin el programa servidor el repositorio no se puede utilizar.

Lo siguiente es importar el directorio del proyecto al repositorio:

$ svn import -m "Firewall de aulas" sslsf svn+ssh://miguev@bundy.dreamhost.com/home/miguev/svn/sslsf
Password:
Adding         sslsf/debian
Adding         sslsf/debian/control
...
Adding         sslsf/Makefile
Committed revision 1.

A partir de ahora no utilizas el directorio original,
sino que te descargas el módulo del SVN y trabajas sobre él:

$ mv proyecto proyecto-original
$ svn checkout svn+ssh://miguev@bundy.dreamhost.com/home/miguev/svn/sslsf
Password:
A    sslsf/debian
A    sslsf/debian/control
...
A    sslsf/Makefile
Checked out revision 1.

Para dejarlo un poco más claro, explico a continuación –muy brevemente– la sintaxis de los comandos svn import y svn export:

svn import -m "Mensaje" proyecto protocolo://usuario@servidor/ruta/al/repositorio/proyecto
svn checkout protocolo://usuario@servidor/ruta/al/repositorio/proyecto
  • El "Mensaje" se añadirá a los registos (logs) de los ficheros que subas al repositorio. Conviene escribir mensajes explicativos, del tipo “Arreglado bug #365″.
  • El proyecto es el directorio que se importa (sube) al repositorio. Conviene eliminar todos los ficheros temporales y limpiarlo antes de subirlo.
  • La parte menos clara de estos comandos es la URL del proyecto dentro del repositorio. Vamos por partes:
  • El protocolo mediante el que se accede al repositorio puede ser http para bajar repositorios públicos, file para trabajar con repositorios locales (otro día escribo sobre eso) o en este caso svn+ssh para utilizar el programa svnserve en el servidor autenticando el usuario mediante SSH.
  • Obviamente, usuario@servidor son el nombre de la cuenta de usuario y el nombre del servidor al que se accede. No tiene que ser necesariamente una dirección de e-mail.
  • La ruta al repositorio /ruta/al/repositorio/ (con barras al principio y al final) es la ruta absoluta hacia el repositorio.
  • Justo después de la ruta al repositorio se añade el nombre del proyecto o módulo que se está importando (subiendo) o exportando (bajando). Si no se especifica esto, los ficheros se subirán al directorio raíz del repositorio, lo cual normalmente no es nada deseable.

Y esto es todo, a partir de aquí trabajamos con la copia local de trabajo que además de los ficheros originales contiene información sobre el repositorio, de modo que no hay necesidad de volver a teclear esa horrorible URL. Tal vez otro día escriba una receta similar para llevar un repositorio SVN en un pendrive.