Subversion Spanish
Subversion Spanish
Subversion Spanish
Tabla de contenidos
Introducción ......................................................................................................... 1
Sistemas de control de versiones ...................................................................... 2
¿Por qué son necesarios? ................................................................................ 2
¿Por qué SVN? ............................................................................................. 3
Aprender Subversion desde CVS ...................................................................... 4
Instalación ........................................................................................................... 5
Instalar Subversion ........................................................................................ 5
Crear un repositorio ....................................................................................... 7
Acceso remoto con Apache ............................................................................. 8
Acceso remoto con svnserve ..........................................................................13
Importar un proyecto ....................................................................................14
Uso ...................................................................................................................15
Como puedo ...? ...........................................................................................15
Propiedades ................................................................................................23
Lo mínimo que necesita saber un cliente ...........................................................25
Software relacionado ............................................................................................25
GUIs .........................................................................................................25
Bibliotecas ..................................................................................................26
Plugins .......................................................................................................26
Scripts .......................................................................................................27
Otros .........................................................................................................32
Enlaces ..............................................................................................................33
Subversion para no desarrolladores ..........................................................................33
¿Qué es? .....................................................................................................33
¿Como funciona? .........................................................................................33
¿Qué requiere? ............................................................................................33
Un ejemplo de sesión de trabajo ......................................................................34
Introducción
Este artículo es un tutorial del sistema de control de versiones Subversion. Se incluyen ejemplos pa-
ra Windows y *nix. No se asumen conocimientos previos. Visita 1x4x9.info
[http://www.1x4x9.info] para obtener la última versión.
La referencia definitiva sobre Subversion es el libro electrónico "Version Control with Subversion
[http://svnbook.red-bean.com/]", que se distribuye gratis en Internet, y que publica O'Reilly en digi-
tal [http://safari.oreilly.com/] y papel. Dicho libro contiene toda la información necesaria para insta-
lar, usar, administrar, y desarrollar Subversion. Este documento solo cubre una mínima parte de su
contenido.
1
Subversion
Normalmente consiste en una copia maestra en un repositorio central, y un programa cliente con el
que cada usuario sincroniza su copia local. Esto permite compartir los cambios sobre un mismo con-
junto de ficheros. Además, el repositorio guarda registro de los cambios realizados por cada usuario,
y permite volver a un estado anterior en caso de necesidad.
Pero, ¿que hacer cuando dos usuarios intentan modificar el mismo fichero?. Existen dos estrategias:
• Merge (fusión de cambios): los ficheros se acceden concurrentemente. Los cambios realizados
sobre un mismo fichero son fusionados inteligentemente por el sistema. El único problema es el
intento de fusión de cambios incompatibles, que ha de solucionarse manualmente.
Subversion se creó para igualar y mejorar la funcionalidad de CVS, preservando su filosofía de de-
sarrollo. Su desarrollo comenzó en el año 2000 como proyecto de código abierto esponsorizado por
CollabNet [http://www.collab.net/]. El líder del equipo de desarrollo fue Karl Fogel, autor de Open
Source Development with CVS [http://cvsbook.red-bean.com/], y fundador de Cyclic Software
(compañía de desarrollo y soporte comercial para CVS, hoy adquirida por SourceGear
[http://www.sourcegear.com/]). La versión 1.0 fue publicada en febrero del 2004. Emplea licencia
Apache/BSD.
Todos los sistemas de control de versiones tienen ciertas características que acaban con estas preo-
cupaciones. Esto es lo que aporta un sistema de control de versiones a un equipo:
• Actualiza ficheros modificados. El cliente recorre nuestro código y sincroniza nuestra copia lo-
cal con el repositorio.
• Historial de cambios. El repositorio guarda registro de todos los cambios realizados. Es posible
recuperar cualquiera de las versiones anteriores de cualquier fichero. Si alguien borra todos los
2
Subversion
• Seguridad. Es posible otorgar diferentes permisos sobre diferentes ramas del proyecto. Por ejem-
plo, estableciendo permiso universal de lectura, y permiso de escritura solo a ciertos usuarios.
Desarrollar un proyecto de software implica invertir mucho tiempo y dinero. No proteger nuestra in-
versión con un sistema de control de versiones es irresponsable y denota un grave desconocimiento
del desarrollo de software.
• Almacena ficheros binarios enteros (no sus diferencias entre versiones). Esto consume espacio
en disco y ancho de banda.
• No usa la red eficientemente. Las diferencias entre versiones solo se envían desde el servidor al
cliente, cuando el cliente sube sus cambios envía ficheros enteros.
• El código fuente es difícil de mantener. CVS comenzó como un conjunto de scripts shell que
usaban RCS e implementaban algoritmos desarrollados entre los años 60-80. El resultado actual
es producto de sucesiones de parches, y no tiene un diseño fácil de entender o mejorar. Esto difi-
culta su evolución. La idea de crear un nuevo CVS desde cero, surgió en la propia compañía que
ofrecía soporte comercial para el CVS.
Aumenta la funcionalidad:
• Registra cambios en la estructura de directorios (permite mover y renombrar sin perder el histo-
rial). Subversion no usa RCS, sino un sistema virtual de ficheros versionado sobre una base de
datos.
3
Subversion
ficheros de lock. Con Berkeley DB no se pueden editar los ficheros a mano como con CVS, pero
eso tampoco es necesario porque el repositorio no se corrompe. Subversion resulta más fiable
que CVS sobre sistema de ficheros transaccional. Nota: Los logs de la base de datos llegan a
ocupar bastante espacio, pero existe una herramienta para eliminarlos (svnadmin).
• Commits atómicos, se realizan todos o ninguno. Las transacciones atómicas permite identificar
conjuntos de cambios. Cuando un desarrollador sube un conjunto de ficheros lo hace en una
transacción atómica, de modo que todos los ficheros se etiquetan con un número de revisión en
el repositorio. La atomicidad también impide que el repositorio quede en estado no compilable
porque la red cae durante la subida de cambios.
• Servidor y cliente intercambian diferencias entre versiones. Al enviar una nueva versión nunca
es necesario transmitir ficheros enteros.
• Interoperabilidad con WebDAV. Es posible acceder al repositorio con cualquier software que
soporte dicho protocolo ("Web Folders" de Windows XP, Photoshop, etc.).
• Arquitectura de red mejorada: Apache 2.0, envío de diffs binarios entre cliente y servidor, datos
comprimidos con mod_deflate.
• Se basa en APIs C bien definidas y documentadas. CVS en cambio, se construyo mediante suce-
siones de parches.
• Usa la biblioteca Apache Portable Runtime, que permite portar la capa de red a varios sistemas
operativos.
• El cliente es una pequeña aplicación que usa una biblioteca de alto nivel.
• No es necesario duplicar el código en el repositorio para crear ramas. Subversion usa copia pere-
zosa, solo se crea un nuevo fichero cuando es modificado. Mientras tanto, el fichero de la nueva
rama, esta implementado como un enlace al fichero original. En contraste, CVS tarda por ejem-
plo 40 minutos en crear un tag de release en el servidor de GCC. Es decir, en Subversion la ope-
ración es O(1), mientras que en CVS es O(n) (lineal respecto al tamaño del repositorio).
• No es necesario conexión a red para ciertas operaciones: status, diff, revert. Esto se debe a que
la copia local contiene una copia del fichero original presente en el repositorio. Este comporta-
miento ahorra ancho de banda a costa de mayor espacio en disco.
4
Subversion
• Subversion proporciona comandos con nuevas funcionalidades: copy, move, merge, resolve,
mkdir, propset, propget, proplist, propdel, propedit, revert, switch, info.
• Numeración de versiones. Con Subversion los números de versión son globales para todo el re-
positorio. No hay un número de versión por fichero.
• Autentificación:
• CVS usa un modo de autentificación propio, con un protocolo propio. Este protocolo debe
usarse con SSH tunneling [http://www.tigris.org/nonav/scdocs/ddSSHGuideCygwin.html], o
implementaciones CVS de kerberos o GSS para que sea seguro.
• Subversion se usa normalmente con HTTP + autentificación BASIC o SSL. También incluye
un servidor propio que podemos usar con SSH tunneling.
• Dejan de existir los conceptos de módulo, ramas, y etiquetas, como entidades separadas:
• Ramas y etiquetas (branches y tags): Internamente no existen tales conceptos, si quieres una
rama la creas a partir de un enlace a un número de revisión del código (se comparte el histo-
rial, no es necesario copiar el proyecto entero). Una etiqueta es una rama a la que no se le
añaden más cambios.
• Palabras clave. Las palabras clave de CVS se expanden automáticamente. Esto fuerza al usuario
a desactivar este comportamiento explícitamente, corriendo peligro de destruir ficheros binarios.
En Subversion, este comportamiento debe ser activado explícitamente.
Instalación
La distribución de Subversion incluye un cliente remoto (svn), un servidor (svnserve), y varias utili-
dades. En este documento se ilustra el uso de Apache como servidor porque permite más posibilida-
des que svnserve. La única ventaja de svnserve es que se configura más fácilmente que Apache. Por
ejemplo, asegurar la comunicación en Apache requiere certificados SSL, mientras que con svnserve
basta usar SSH.
Instalar Subversion
Puedes encontrar paquetes para Windows, Debian, RedHat, SuSE, Mandrake, pkgsrc
({Net,Open,Free}BSD, Linux, Solaris, etc.), Solaris, y OSX, a través de la página
http://subversion.tigris.org/project_packages.html.
Aquí se describe la instalación en Debian y Windows. Tras este paso podremos usar Subversion des-
de consola. Más adelante activaremos el acceso HTTP que nos permitirá compartir el repositorio
con otros desarrolladores, y acceder con programas que usan este protocolo (Eclipse, TortoiseSVN,
etc.).
Debian
Existe un paquete subversion [http://packages.debian.org/subversion] versión 1.0.5-1 unstable y
1.0.0-1 testing. La última versión liberada del proyecto a 27 de julio es 1.1.0-rc1. Hay una versión
1.0.5-0 portada a woody aquí [http://people.debian.org/~cjwatson/subversion-woody/].
5
Subversion
Aviso
Las versiones hasta la 1.0.5 (incluida) presentan una vulnerabilidad en el módulo
mod_authz_svn. En la versión 1.0.5-1 ya esta solucionado.
Aviso
La instalación unstable y testing requiere libc6.1 (2.3.2.ds1-11)
[http://packages.debian.org/unstable/base/libc6.1], una biblioteca usada por multitud de
programas del sistema. Dependiendo de lo actualizado que este tu sistema, podría requerir
una actualización masiva.
Nota
wajig es un frontend simplificado para varios comandos apt-* y dpkg. Prueba apt-get
install wajig y wajig help. O si no quieres complicarte, usa el apt-get install de toda la vi-
da.
Opcionalmente podemos instalar subversion-tools, unos scripts que facilitan la administración del
repositorio:
Windows
De la página de descarga [http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91],
hay dos versiones:
• "Windows installer with the basic Subversion Win32 binaries". Versión autoinstalable.
6
Subversion
Aviso
Como regla general, evita los directorios con espacios cuando uses versiones Windows de
herramientas Unix. Casi siempre deberían funcionar sin problemas, yo lo he hecho por pro-
bar y funciona, pero no es recomendable.
Aviso
Si usas Windows XP necesitas el Service Pack 1.
Tras instalar deberíamos poder abrir una consola tras la instalación y operar con Subversion en lo-
cal:
D:\>svn
Type 'svn help' for usage.
Crear un repositorio
El repositorio es el árbol de directorios donde Subversion almacena nuestros ficheros y cambios.
• Debian:
mkdir -p /var/local/repos
svnadmin create /var/local/repos
# doy permisos al servidor web
chown -R www-data:www-data /var/local/repos
• Windows:
Si no hay problemas tampoco veremos aparecer mensajes por consola. Esto puede sorprender a
usuarios Windows, pero en Unix, muchos comandos se comportan así.
Lo que vemos son ficheros y directorios de una instancia de la base de datos Berkeley. Esta es una
novedad frente al CVS: los proyectos no se guardan en el sistema de ficheros, sino en una base de
datos. Esto asegura que cualquier transacción que realicemos
7
Subversion
• es atómica,
O dicho de otro modo, cualquier operación con Subversion posee las propiedades ACID (Atomic,
Consistent, Isolated, Durable) propias de toda base de datos.
Nota
La información esta más segura en una Base de Datos que en un sistema de ficheros. Pero
si llegados a este punto te asusta no ver físicamente tus ficheros, espero que eso refuerce en
ti la sana costumbre de hacer backups. :-)
NUNCA será necesario operar manualmente sobre el contenido del repositorio. En su lugar debe-
mos usar las herramientas que proporciona Subversion. Por tanto, no realizaremos más visitas a este
directorio.
Instalar Apache
Debian
En Debian Apache viene en sabores moderno, tradicional, y suicida:
Perchild is the grown up, mac daddy version of suexec for apache2. Rather than
execute a cgi script as a given user, perchild forks a process for each vhost, then
su's to the correct user/group for that vhost. Each process then uses a thread model
8
Subversion
similar to that of the worker mpm. THIS MPM IS NOT CURRENTLY EXPEC-
TED TO WORK CORRECTLY, IF AT ALL. IT IS UNDER VERY HEAVY DE-
VELOPMENT. This mpm is still highly experimental, and should be used with
care.
Para que apache transforme las operaciones HTTP de los clientes de Subversion, en operaciones so-
bre el repositorio, es necesario instalar el módulo libapache2-svn
[http://packages.debian.org/unstable/net/libapache2-svn]:
Windows
Para acceder al repositorio usando un cliente HTTP (por ejemplo el plugin subclipse de Eclipse
[www.eclipse.org]), necesitaremos instalar Apache2.0.48 (no valen el 1.x ni el 2.0.46). La instala-
ción es trivial, descarga y ejecuta apache_2.0.48-win32-x86-no_ssl.msi
[http://apache.rediris.es/httpd/binaries/win32/apache_2.0.48-win32-x86-no_ssl.msi]. Siempre se ins-
tala en un directorio Apache2, por tanto, si lo quieres en d:\httpd\Apache2, indica c:\httpd
como directorio de instalación. Por defecto se añadirá como servicio y al iniciar Windows veremos
aparecer un monitor de Apache la bandeja, al lado del reloj.
Configurar Apache
Aquí se explica como configurar el módulo para que opere con nuestro repositorio, y como restrin-
gir el acceso usando autentificación básica.
Apache permite otras posibilidades que aquí no se mencionan, como por ejemplo, comprobar los
passwords contra base de datos, crear grupos de usuarios, permitir el acceso de los usuarios solo a
ciertas ramas del repositorio, autentificar por IP, y otras. Para más información sobre restricciones
de acceso podemos consultar el apartado seguridad en algún tutorial acerca de Apache
[http://httpd.apache.org/docs-2.0/misc/tutorials.html].
Debian
Para configurar el módulo mod_dav_svn, edita /
9
Subversion
#<Location /svn>
#</Location>
<Location /repos>
DAV svn
SVNPath /var/local/repos
</Location>
Revision 0: /
Powered by Subversion version 1.0.5 (r9954).
Windows
Primero copiamos el fichero mod_dav_svn.so de la instalación de Subversion (C:\Program
Files\Subversion\httpd\mod_dav_svn.so) al directorio modules de la instalación de
apache (C:\Program Files\Apache2\modules\).
<Location /repos>
DAV svn
SVNPath d:/repositorio
</Location>
# observa que hemos usado d:/ y no d:\
Reiniciamos apache usando el monitor. Si el monitor indica que la operación ha fallado, conviene
abrir una consola en el directorio bin de la instalación de Apache (en mi ordenador es
10
Subversion
D:\programas\Apache2\bin>apache -e debug
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module access_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module actions_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module alias_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module asis_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module auth_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module autoindex_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module cgi_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module dav_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module dav_svn_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module dir_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module env_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module imap_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module include_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module isapi_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module log_config_modul
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module mime_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module negotiation_modu
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module setenvif_module
[Wed Mar 03 22:22:54 2004] [debug] mod_so.c(290): loaded module userdir_module
Vemos que entre otros ha cargado el módulo dav_svn_module. En este punto la consola se queda
bloqueada, Apache espera peticiones. Ya deberías poder acceder por red, comprueba la dirección
http://127.0.0.1/repos/. Deberías ver algo como
Pulsamos Ctrl+C para cerrar la consola, y arrancamos Apache desde el monitor, o desde la consola
de servicios de Microsoft. Desgraciadamente, a mí me falló en ambos casos el servicio, y cuando
consulte el visor de eventos del sistema encontré este mensaje:
Por desgracia seguía sin funcionar, y DependencyWalker no daba más pistas. En la lista de correo
leí que debía copiar los ficheros libdb42.dll, libeay32.dll, ssleay32.dll, del bin/
de la instalación de Subversion al directorio modules de Apache.
Como aun así seguía sin funcionar copie todas las .dll de subversion/bin al modules/ de Apache, en
algún caso, sobreescribiendo la versión de Apache que había copiado antes. No es un método muy
científico pero funcionó. Supongo que el módulo de Subversion prefería las librerías de Apache
contra las que había sido compilado.
11
Subversion
Restringir el acceso
Aquí se explica como configurar Apache para restringir el acceso usando autentificación básica
(basic authentication) o SSL.
La autentificación básica no es segura porque envía los passwords a través de la red codificados en
base64 (un algoritmo que proporciona muy poca protección). Estos passwords pueden capturarse
con un sniffer y desencriptarse con paciencia. Por tanto:
• Si el servidor esta expuesto a Internet, convendrá usar SSL para operaciones de escritura y ase-
gurar Apache [http://www.securityfocus.com/infocus/1694] contra ataques.
• Si lo vamos a usar en un entorno seguro (una intranet) y solo nos interesa identificar a los usua-
rios que realizan cada cambio en el repositorio, basta la autentificación básica.
Debian
Volvemos a editar la configuración del módulo (/
etc/apache2/mods-available/dav_svn.conf):
<Location /repos>
DAV svn
SVNPath /var/local/repos
AuthType Basic
AuthName "Subversion repository"
# fichero de passwords
AuthUserFile /etc/subversion/passwd
# permito las opciones GET PROPFIND OPTIONS REPORT a usuarios anonimos
<LimitExcept GET PROPFIND OPTIONS REPORT>
# pero requiero autentificación para el resto de operaciones (las de esc
Require valid-user
</LimitExcept>
</Location>
Y reinicia:
<Location /repos>
DAV svn
12
Subversion
SVNPath d:/repositorio
# Autentificación básica.
AuthType Basic
AuthName "Repositorio Subversion"
AuthUserFile D:/programas/Apache2/bin/usuarios.txt
# Solo permitimos usuarios identificados en el fichero de passwords.
#require valid-user
# Solo permitimos usuarios identificados en el fichero de passwords
# con nombre 'jano' o 'alicia'.
#require user jano alicia
# La lectura es libre pero solo permitimos usuarios identificados
# en el fichero de passwords para otras operaciones.
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>
Y reiniciamos:
Instalar svnserve
Si ya has instalado Subversion, ya tienes el programa svnserve. El propio comando nos muestra las
opciones de arranque:
$ svnserve --help
Usage: svnserve [options]
Valid options:
-d [--daemon] : daemon mode
--listen-port arg : listen port (for daemon mode)
--listen-host arg : listen hostname or IP address (for daemon mode)
--foreground : run in foreground (useful for debugging)
-h [--help] : display this help
-i [--inetd] : inetd mode
-r [--root] arg : root of directory to serve
-R [--read-only] : deprecated; use repository config file
-t [--tunnel] : tunnel mode
-X [--listen-once] : listen once (useful for debugging)
Windows
No es aconsejable usar svnserve en Windows porque necesita fork para gestionar el acceso concu-
rrente, pero Windows no lo implementa. Desconozco que problemas pueden darse. En Windows po-
demos usar este wrapper [http://dark.clansoft.dk/~mbn/svnservice/] para instalarlo como servicio.
/usr/sbin/inetd --install-as-service
net start inetd
13
Subversion
/usr/sbin/inetd -d
Para SSH también necesitaremos OpenSSH y OpenSSL. Instalalos y comprueba que que estan ahi:
$ ssh -version
OpenSSH_3.8p1, SSH protocols 1.5/2.0, OpenSSL 0.9.7d 17 Mar 2004
Bad escape character 'rsion'.
Linux
Por defecto, el servidor escucha en el puerto 3690 reservado por la IANA
[http://www.iana.org/assignments/port-numbers] para el protocolo svn.
$ svnservce -d
$ svnserve -i
( success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) )
Importar un proyecto
Ya tenemos el repositorio funcionando en red. Para iniciar un proyecto simplemente creamos un
subdirectorio donde iremos añadiendo ficheros. Durante el resto del documento usare un minipro-
yecto casero llamado "awpool".
Si ya tienes un proyecto y quieres importarlo necesitareis una copia libre de directorios CVS/ (si es
que usábamos CVS). Lo más sencillo es eliminar los directorios e importar en el CVS.
Si vais a conservar el repositorio CVS convendrá etiquetar la versión a partir de la cual has migrado
a Subversion. Por ejemplo, vamos a etiquetarlo como "release1":
En mi caso no quería perder mi copia local del CVS, así que me baje esa release exacta exportando.
En CVS exportar significa bajarte el código sin control de versiones, o sea, sin los directorios CVS/:
mkdir /home/jano/release1
cvs export -r release1 awpool
14
Subversion
De un modo u otro, deberíamos acabar con el código listo para ser importado.
La operación anterior tarda un rato, veremos desfilar todos los ficheros que están importándose. Si
olvidaste eliminar la versión compilada de tú programa (ooops!!) también se añadirá y tendrás que
borrarla luego. Cuando termina, puedes conectarte por web para ver el resultado, o hacer checkout
(descargarlo) desde otro directorio:
mkdir /home/jano/awpool
cd /home/jano/awpool
svn checkout http://127.0.0.1:80/repos/awpool/trunk .
La copia local generada tiene un subdirectorio .svn junto a cada directorio. Es el equivalente a los
antiguos CVS/, pero su contenido tiene un formato distinto.
Guardar la versión principal en un subdirectorio trunk no es obligatorio, pero ese y otros, son los
elementos acostumbrados en un repositorio:
• trunk/ Por convención suele usarse para el código principal del proyecto. Cuando la gente di-
ce "get the head of the trunk", se refieren a que te bajes la última versión de este directorio.
• branches/ Ramas del desarrollo. Copias del código principal con cambios experimentales.
Uso
Como puedo ...?
Bajar el proyecto (checkout)
Primero nos bajamos el proyecto que creamos antes, o algún otro que encontremos por ejemplo en
http://svn.apache.org/repos/asf/. Yo bajé el que cree antes:
Esta copia local contiene un subdirectorio svn en cada directorio, lo que permite que sea gestionada
con el cliente de Subversion.
15
Subversion
Resolver conflictos
Acabo de modificar un fichero en local, y voy a actualizarlo para luego hacer commit (no quiero
machacar los cambios de nadie). Pero al actualizar Subversion muestra una C de conflicto junto al
fichero:
debian:/# ls
GenericsTest.java # el fichero con mis cambios y marcas de conflicto
GenericsTest.java.mine # el fichero con mis cambios
GenericsTest.java.r4 # la revisión antes de mis cambios
GenericsTest.java.r5 # la última revisión que acabo de actualizar
Todo esto ocurre porque desde la última vez que bajé este fichero, alguién más lo cambio, y al ac-
tualizarme con el servidor he recibido un trozo de código que entra en conflicto con mis cambios. O
dicho de otra manera, un cambio que de haberse aplicado sobreescribiría mis propios cambios, y yo
perdería información. Afortunadamente siempre podemos actualizar sin miedo, porque Subversion
suspende la fusión de cambios y nos advierte del conflicto.
Vamos a abrir el fichero para ver que aspecto tienen las "marcas de conflicto":
Observa que hay un trozo <<< .mine mi-código === y un trozo === código-revi-
sión-2 >>> .r2. Se corresponden a mi código y al código de la revisión 2 que acabo de bajar-
me.
16
Subversion
• Descartar mis cambios locales, o los cambios que baje del servidor. Esto se hace sobreescribien-
do el fichero original GenericsTest.java por alguna de las copias que han aparecido.
Oops! el cambio correcto no era el mío, asi que he dejado lo que ya había.
Como ves, normalmente se soluciona intuitivamente editando el fichero a mano. Si quieres más de-
talles consulta el manual de Subversion:
http://svnbook.red-bean.com/html-chunk/ch03s05.html#svn-ch-3-sect-4.4.
Es buena práctica pensar por adelantado en el mensaje de log que vamos a usar, y hacer commits de
cambios relacionados. De ese modo es más fácil revisar los cambios buscando errores. Conviene de-
finir una variable SVN_EDITOR=kedit (o SVN_EDITOR=notepad) para usarlo como editor por
defecto. De no hacerlo, tendremos que añadir el flag -m 'mensaje' para el obligado comentario que
debe acompañar todo commmit.
El cliente svn lanzará el editor configurado, escribimos el mensaje de log, grabamos, cerramos el
editor, y el commit se realiza. Un ejemplo de la salida en Windows:
Si alguno de los ficheros que enviamos ha sido modificado en el repositorio, es obligado que actua-
licemos dichos cambios (usando update) antes de hacer commit. Esto evita que machaquemos los
cambios de otros usuarios.
17
Subversion
svn status
$ svn status
L ./abc.c # fichero bloqueado
M ./bar.c # modificado localmente
M ./baz.c # modificado localmente en sus propiedades, no en s
? ./foo.o # fichero ignorado
! ./foo.c # fichero borrado por el usuario u otro programa
~ ./qux # versionado como fichero pero es directorio (o vic
A + ./moved_dir # añadido con historial de procedencia
M + ./moved_dir/README # añadido con historial y tiene modificaciones loca
D ./stuff/fish.c # preparado para borrado
A ./stuff/loot/bloo.h # preparado para añadir
C ./stuff/loot/lump.c # conflictos con un update
S ./stuff/other_dir # directorio cambiado a rama
G ./foo.c # modificado localmente e incorporados cambios remo
Hemos deshecho los cambios que se hicieron tras la revisión 3. Observa que ahora he colocado una
opción a la derecha del comando en vez de a la izquierda. En Subversion no importa donde colocar
las opciones.
18
Subversion
Committed revision 5.
También podemos mostrar log operando directamente sobre el servidor, sin necesidad de habernos
bajado nada:
19
Subversion
Si ejecutamos el comando sobre una URL la eliminación será inmediata. Después de ejecutar rm y
commit, los ficheros/directorios, habrán desaparecido de la copia local y el HEAD del repositorio,
pero permanecerán sus revisiones anteriores.
Para evitar problemas conviene crear una rama (branch). Una rama es una copia del código principal
que evoluciona por separado, pero que tiene un pasado común respecto al origen a partir del cual se
creó. En otras palabras, un proyecto propio con el cual experimentar. Más adelante, cuando hayamos
completado nuestro trabajo, fundiremos nuestros cambios con la rama principal del proyecto. SVN
proporciona un comando merge para integrar una rama en otra.
Nota
20
Subversion
Suele hablarse de ramas principal y secundaria, pero internamente no existe esa distinción,
son simplemente dos directorios del repositorio. De hecho, para Subversion no existe el
concepto de rama, es solo un nombre que nosotros empleamos.
Un tema problemático con la fusión de cambios entre ramas, es que mientras trabajamos en una ra-
ma, el resto del equipo sigue añadiendo cambios a la principal. Sería deseable que la rama donde
trabajamos integrase automáticamente los cambios producidos en el código principal para evitar dis-
crepancias al integrar los cambios en el código principal. Esta funcionalidad esta prevista en alguna
de las versiones posteriores a la 1.0, por ahora el soporte de merge es similar al del CVS.
cd /cygdrive/d/desarrollo/awpool
svn copy trunk branch-awpool2
svn commit -m "creo la rama branch-awpool2"
La copia no duplica el código en disco, tal como hace CVS, sino que crea enlaces apuntando al códi-
go existente. Lo único que ocupará espacio en disco serán los cambios que introduzcamos a partir de
aquí.
cd /cygdrive/d/desarrollo/awpool
svn copy trunk release-1.0
svn commit -m "marco el proyecto con la etiqueta release-1.0"
Aunque pueda sorprender a los veteranos del CVS, esto es coherente con lo que veíamos en el apar-
tado "Branches". El comando copy crea un enlace a una revisión del código. Si no añadimos cam-
bios es como si hubiéramos etiquetado una versión del código. Si añadimos cambios es como si tu-
viéramos una rama. Internamente, Subversion no conoce los conceptos etiqueta y rama, solo entien-
de de directorios del repositorio.
cd /home/jano/tmp
svn export http://localhost/repos/awpool/trunk
tar cf trunk.tar trunk
gzip -9 trunk.tar
21
Subversion
* Dumped revision 4.
* Dumped revision 5.
o en Windows:
• eliminar todos los ficheros y dejar vacío el repositorio (el historial permanecerá),
• o eliminar físicamente todo el repositorio, crear uno nuevo, y restaurar las copias de seguridad.
Al intentar acceder a un mismo repositorio Windows en FAT32 desde linux aparece este mensaje:
El problema es que la base de datos de Berkeley usa shared memory (un método de comunicar dos
procesos usando una misma región de memoria), y almacena los punteros en ficheros cuyo formato
es diferente entre windows y linux.
22
Subversion
en vez de la base de datos de Berkeley. Es una funcionalidad de Subversion que a día de hoy (agosto
de 2004) aun no es estable. Consulta la lista de desarrollo
[http://subversion.tigris.org/servlets/ProjectMailingListList] de Subversion para más información.
Propiedades
Subversion permite adjuntar pares arbitrarios nombre/valor a ficheros y directorios. Estos metadatos
se llaman propiedades en Subversion. Las propiedades son versioneadas, es decir, se almacenan sus
sucesivos valores igual que se hace con los ficheros.
Las propiedades son modificaciones locales que no serán permanentes hasta que ejecutemos com-
mit. Como cualquier modificación, las propiedades pueden verse con diff, status, revert.
svn:executable
Solo para ficheros. Si esta propiedad existe, significa que el fichero es ejecutable. El valor de esta
propiedad es irrelevante.
svn:mime-type
Sirve para indicar el tipo mime. Normalmente no es necesario porque los comandos add e import,
incorporan un algoritmo de detección.
23
Subversion
Si establecemos el tipo mime a algo que no comience por text/, Subversion supone que es un fichero
binario, si no, supone que es de texto simple.
Cuando recuperamos un fichero usando el navegador, el módulo mod_dav_svn lo envía con el valor
del mime-type en la cabecera Content-type.
svn:ignore
Se aplica a un directorio y permite establecer patrones de ficheros que serán ignorados por SVN. Si
queremos crearla, es conveniente usar el comando propget. Esto es similar al .cvsignore del
CVS.
Debemos actualizar el directorio: svn update directorio antes de hacer commit a ese directorio.
svn:eol-style
Sirve para forzar los códigos de control de los saltos de línea los ficheros. Si desarrollamos desde
varios sistemas operativos, podemos emplear esta propiedad para hacer siempre checkout en el salto
de línea nativo del sistema que usemos.
Por defecto, los ficheros en el repositorio tienen los mismos saltos de línea que en la copia de traba-
jo. Los valores posibles son:
• LF
• CR
• CRLF
• native: los ficheros aparecen siempre con los saltos de línea propios del sistema operativo local.
En el repositorio los ficheros se guardan con LF.
svn:keywords
Subversion sustituye cinco palabras clave, aquí se listan junto con su sinónimo:
• LastChangedDate, Date Fecha del último cambio, por ejemplo: 2002-07-22 21:42:37 -
0700 (Mon, 22 Jul 2002)
• LastChangedRevision, Rev Última revisión en que fue cambiado el fichero. Por ejemplo:
18
• Id Sumario de las palabras anteriores. Por ejemplo: bar 148 2002-07-28 21:30:43 epg, que sig-
nifica que el fichero bar cambio en la revisión 148, por el usuario epg, en la fecha 2002-07-28
21:30:43.
24
Subversion
Ejemplo:
Software relacionado
GUIs
25
Subversion
Bibliotecas
Subversion esta compuesto por bibliotecas de funciones C que cumplen interfaces claramente defi-
nidos. Por ejemplo, existen varias bibliotecas que cumplen el interfaz de acceso al repositorio:
• libsvn_ra_svn: administra accesos usando el protocolo propio SVN. Se usa con el servidor svn-
serve.
• Repositorio.
• Acceso al repositorio.
• Cliente.
Para usar Subversion desde lenguajes que no sean C, se proporcionan ligaduras SWIG
[http://www.swig.org/]. SWIG es un compilador que permite enlazar código C/C++/Objective-C
con lenguajes de script como Perl, Python, Ruby, y Tcl. Funciona en Unix, Win32 con Cygwin
[http://www.cygwin.com/]/Mingw [http://www.mingw.org/], y Macintosh. Para más detalles consul-
ta la página SWIG de compatibilidad en plataformas [http://www.swig.org/compat.html]. Otra op-
ción para usar Subversion es ejecutar y comunicarse directamente con un cliente C desde un lengua-
je no C, pero la precisión y riqueza de datos siempre será mayor usando las librerías nativas.
Plugins
26
Subversion
Subclipse 3 + Eclipse 3
En Windows es posible usar Subclipse contra un repositorio remoto sin instalar Subversion.
En Linux o OSX necesitaremos instalar primero Subversion. Subclipse emplea ligaduras JNI
(bindings javahl [http://svn.collab.net/repos/svn/trunk/subversion/bindings/java/javahl/]). Los bin-
dings se enlazan dinámicamente con las fuentes de Subversion, esto significa que cada versión de
Subclipse se crea con respecto a una versión de Subversion, y puede dar problemas si no se emplean
las versiones correspondientes.
Con conexión a red, el mejor modo de instalarlo es añadiendo el sitio de actualización de Subclipse.
Esto nos permitirá actualizar cómodamente a futuras versiones. Para instalarlo haz lo siguiente:
• Name: Subclipse
• URL: http://subclipse.tigris.org/update
En una LAN con más usuarios, conviene descargar el sitio de actualización de Subclipse
[http://subclipse.tigris.org/servlets/ProjectDocumentList?folderID=2240] y colocarlo en un servidor
local o directorio compartido. En la página de descarga se explica como
[http://subclipse.tigris.org/files/documents/906/14882/README.localsite.txt]. Es el mismo procedi-
miento de antes solo que apuntaremos al servidor/directorio local.
Scripts
27
Subversion
CVS2SVN
Permite crear un repositorio Subversion a partir de otro CVS. Funciona casi siempre, o sea, que
existe algún caso en que no funciona 100% correcto. Para usarlo necesitamos instalar Python y
ViewCVS (ViewCVS contiene un módulo para interpretar ficheros RCS). Su funcionamiento es
simple:
ViewCVS
El soporte para Subversion en ViewCVS solo existe en el CVS. Lo he probado en Windows y el re-
positorio es navegable, pero ciertas operaciones producen errores que no he investigado. Si a alguien
le interesa ir más allá debería empezar por consultar el error en la lista de correo de ViewCVS
[http://mailman.lyra.org/mailman/listinfo/viewcvs-dev].
Windows
Suponemos instalados Apache y Subversion.
28
Subversion
[http://aspn.activestate.com/ASPN/docs/ActivePython/2.3/UserGuide/install.html#windows_(x
86)]. También podeis instalar el de python.org (Python-2.3.3.exe
[http://www.python.org/ftp/python/2.3.3/Python-2.3.3.exe], 9Mb), pero al instalar ViewCVS
más adelante pide unas librerías que podéis obtener bajando las extensiones win32 de Mark
Hammond [http://starship.python.net/crew/mhammond/] (pywin32-200.win32-py2.3.exe
[http://prdownloads.sourceforge.net/pywin32/pywin32-200.win32-py2.3.exe?download],
3.16Mb). Yo he probado con el de Python.org. Si quieres las extensiones 2.4 necesitarás haber
instalado Python 2.4 y tener la dll msvcrt71.dll en tu sistema, que puedes conseguir instalando
el framework .Net (23Mb), o aqui [http://www.frenzy.hu/prog/down/crt_mfc.zip], o en Google.
3. Ahora necesitamos el HEAD del ViewCVS porque por ahora no hay release con soporte sub-
version. Suponiendo CVS instalado, los comandos son
# password en blanco
cvs -d :pserver:[email protected]:/cvsroot/viewcvs login
cvs -d :pserver:[email protected]:/cvsroot/viewcvs co viewcvs
python viewcvs-install
[general]
# no voy a usar cvs
# cvs_roots = cvs: /home/cvsroot
# ruta a mi repositorio
svn_roots = main: d:/repositorio
# nombre del root por defecto, aqui solo tengo uno :-)
default_root = main
29
Subversion
d:\programas\Python23.
7. Si tienes CygWin instala diffutils, enscript, gzip, libiconv, libintl, rcs, sed, zlib en versiones
CygWin [http://www.cygwin.com/], GNUWin32 [http://gnuwin32.sourceforge.net/], o minGW
[http://www.mingw.org/]. Puedes prescindir de este paso por ahora, el repositorio resultante se-
rá navegable, si intentamos hacer un diff y no tenemos rcs dirá algo como esto:
error: (2, 'CreateProcess', 'The system cannot find the file specified.')
Figura 2.
• Cuando navegas aparece un número de revisión, y si pulsas en el enlace aparecen todos los
ficheros pertenecientes a ese commit. Recuerda que los números de versión son globales
para todo el repositorio, es decir, coinciden con el número de commits realizados.
• Todos los ficheros tienen la misma marca de tiempo y comentario. Es porque Subversion
usa transacciones y constan como añadidos en el mismo instante.
30
Subversion
• La dirección del administrador no esta configurada. Quizás nos convenga hacerlo luego. Si
queremos un servidor local de correo podemos usar James [http://james.apache.org] de
Apache.
WebSVN
WebSVN es un script PHP que usa comandos Unix. Para aumentar el rendimiento cachea el conte-
nido. Desconozco que política de cache sigue, ni que rendimiento tendría en un sitio en Internet.
Los comentarios siguientes son de una instalación en Windows, pero se podrían adaptar sin proble-
ma a Linux. Si ya hemos instalado Subversion y Apache hacemos esto:
• Ignoramos los comentarios del tipo "he leído por ahí que PHP no es estable en Apache2".
• Opcionalmente instalamos los comandos diff, enscript, gzip, sed, por ejemplo con CygWin
[http://www.cygwin.com]. Aunque no instalemos estos comandos igualmente podremos navegar
por el repositorio, pero si por ejemplo no instalamos diff, no podremos hacer diff, etc.
$config->setServerIsWindows();
$config->setSVNCommandPath("d:\\tools\\svn\\bin");
$config->setEnscriptPath("c:\\cygwin\\usr\\bin\\enscript");
$config->addRepository("repositorio", "d:\\repositorio");
31
Subversion
Figura 3. websvn
Otros
32
Subversion
Enlaces
Página de enlaces en subversion.tigris.org: http://subversion.tigris.org/project_links.html
¿Qué es?
• Cada usuario puede participar desde un ordenador conectado a Internet o una red local.
• El servidor recuerda todos los cambios realizados sobre un fichero y permite recuperar versiones
anteriores.
• Subversion es gratuito.
¿Como funciona?
• Cuando un usuario realiza un cambio, lo envía al servidor para que otros usuarios puedan des-
cargarlo.
• El servidor guarda los ficheros dentro de una base de datos (no son visibles en el sistema de fi-
cheros).
¿Qué requiere?
• Hay versiones para Windows y cualquier sistema basado en Unix.
33
Subversion
• Una instalación básica solo requiere conocimientos a nivel de usuario del sistema operativo.
Subversion proporciona integración con entornos de desarrollo como Eclipse, JBuilder, u otros.
Normalmente ejecutaremos las mismas operaciones que acabamos de ver usando los menús de un
interfaz gráfico.
Índice
A
Acceso remoto con Apache, 8
Acceso remoto con svnserve, 13
add, 20
B
blame, 19
C
checkout, 15
cleanup, 22
commit, 17
Configurar Apache, 9
Crear un repositorio, 7
D
diff, 20
dump, 21
E
export, 21
H
help, 22
34
Subversion
I
Importar un proyecto, 14
Instalar Apache, 8
Instalar Subversion, 5
Instalar svnserve, 13
L
log, 19, 19
Lo mínimo que necesita un cliente, 25
M
move, 18
O
obliterate, 22
P
propdel, 23
propedit, 23
propget, 23
Propiedades, 23
proplist, 23
propset, 23
R
Restricciones de acceso, 12
revert, 20
rm, 19
S
status, 18
svn:eol-style, 24
svn:executable, 23
svn:ignore, 24
svn:keywords, 24
svn:mime-type, 23
T
Trabajando con svn, 15
U
update, 16, 18
35