Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Alejandro Alvarez
Ayllon
21 de febrero de 2008
Este apendice es una gua introductoria al sistema de control de versiones
Subversion. Si necesita una documentacion completa puede consultar Version
Control with Subversion[4]
1.
Introducci
on
1.1.
Qu
e es
1.2.
Vocabulario
A continuaci
on se describen algunos terminos de uso habitual en este ambito.
Lnea base (Baseline) Una revision aprobada a partir de la que se pueden
realizar cambios.
Rama (branch) Conjunto de ficheros con dos o mas copias mantenidas de
forma independiente.
Check-out (checkout, co) Crear una copia para trabajar localmente.
1.2.1.
Caractersticas
Control de directorios Subversion implementa un sistema de ficheros virtual que controla los cambios a todo el arbol de directorios.
Control verdadero Subversion permite el a
nadido, borrado, copia y renombrado de archivos y directorios, teniendo cada nuevo archivo un historial propio aunque el nombre coincida con un archivo antiguo que fuera
borrado.
Envos at
omicos Un conjunto de cambios se aplican al repositorio completamente o no se aplica ninguno, evitando inconsistencias.
Metadatos versionados A cada archivo o directorio se le puede aplicar cualquier propiedad que se quiera, manteniendo un historial de los cambios.
Elecci
on de las capas de red Subversion abstrae el acceso al repositorio, por
lo que se puede implementar distintas maneras de hacerlo a traves de la
red: como m
odulo de Apache HTTP Server, por ejemplo. Tambien existe
un peque
no y ligero servidor que puede usarse facilmente a traves de SSH.
Manejo consistente de los datos La diferencia entre archivos se almacena
usando un algoritmo diferencial binario, por lo que se puede aplicar a
archivos de texto o binarios.
2.
Instalaci
on
Subversion est
a construido sobre una capa de portabilidad llamada APR
(Apache Portable Runtime library), lo que significa que es capaz de funcionar
en cualquier sistema operativo en el que el servidor Apache httpd se ejecute:
Windows, Linux, todos los BSD, Mac OS X, Netware, etc.
La manera m
as sencilla de instalarlo es descargar el paquete construido para
su sistema operativo desde el sitio web de Subversion (http://subversion.tigris.org).
Normalmente pueden encontrarse instaladores graficos para los usuarios de sistemas operativos de Microsoft. Si usa un sistema Unix-like, puede usar el sistema
nativo de paquetes (RPMs, DEBs, etc.) para obtener Subversion.
Como alternativa, puede compilar Subversion directamente a partir de la
u
ltima versi
on del c
odigo fuente. Antes de descomprimirlo siga las instrucciones del archivo INSTALL. Tenga en cuenta que un paquete contiene todo lo
necesario para compilar un cliente capaz de conectarse a repositorios remotos,
pero opciones adicionales pueden tener otras dependencias (como Berkeley DB
o Apache httpd). Si quiere compilar una version completa debe asegurarse de
que tiene todos los paquetes listados en el archivo INSTALL.
Si quiere trabajar en el codigo, puede usar su cliente para obtener el codigo
m
as reciente.
3.
Gua b
asica r
apida
3.1.
Checkout inicial
Lo primero que debe hacer es obtener una copia de trabajo local a partir del
repositorio central:
$ svn checkout svn://osl.uca.es/proyecto
Esto crear
a un nuevo directorio llamado proyecto, dentro del que se descargar
an todos los archivos del mismo. Una vez hecho esto ya puede empezar a
trabajar como lo hara normalmente.
NOTA: Aunque puede usarlo como si fuera un directorio normal,
para copiar o mover archivos debera usar los comandos svn copy y
svn move en lugar de los habituales.
Dentro de cada directorio del proyecto se creara otro directorio llamado
.svn. No borre ni modifique su contenido bajo ning
un concepto.
Si quiere descargar el proyecto en un directorio con un nombre diferente,
puede hacerlo:
$ svn checkout svn://osl.uca.es/proyecto MiProyecto
De esta forma en lugar de crear un directorio llamado proyecto se creara uno
llamado MiProyecto.
3.2.
Ciclo de trabajo b
asico
U El archivo se ha actualizado.
A El archivo se ha a
nadido.
D El archivo ha sido borrado.
R Se ha sustituido el archivo por otro con el mismo nombre. Subversion los
considera diferentes.
G El archivo actualizado haba sido modificado localmente, pero los cambios
no se pisan, as que se han fundido ambas versiones.
C Los cambios locales y los realizados en el repositorio se solapan. Es necesario
solucionar manualmente el conflicto.
3.2.2.
Realizar cambios
3.3.
A Ha sido a
nadido.
C En conflicto.
D Marcado para borrar.
M Modificado.
R Marcado para ser reemplazado.
X No est
a versionado pero esta relacionado con definiciones externas (para m
as informaci
on consultar el manual de Subversion).
? No est
a bajo control.
! Est
a bajo control pero no se encuentra o tiene alg
un error. Puede usar
svn revert para recuperarlo.
Est
a bajo control como un tipo diferente al que hay en la copia de
trabajo (por ejemplo, controlado como archivo y actualmente es un
directorio).
I No est
a bajo control y esta marcado para que subversion lo ignore cuando se usen los comandos svn add, svn status y svn import.
svn diff Muestra los cambios realizados sobre un archivo en concreto si se especifica o sobre todos en general. Indica las lneas a
nadidas y eliminadas
usando el formato del diff unificado[2].
svn revert Deshace los cambios realizados sobre el fichero o directorio pasado
como par
ametro, volviendo a la revision anterior.
3.4.
Solucionar conflictos
Si Subversion encuentra un conflicto al actualizar un fichero creara tres archivos que no est
an bajo control del repositorio:
filename.mine El archivo de la copia de trabajo.
filename.rOLDREV La revision anterior (sin cambios).
filename.rNEWVER La nueva revision obtenida del repositorio central al
actualizar.
Subversion no le permitira subir cambios hasta que estos tres archivos hayan
sido borrados.
Puede solucionarlo de tres maneras:
Manualmente Editando el archivo de la copia de trabajo y ejecutando svn
resolved FILENAME.
Sobreescribiendo el archivo Puede sobreescribir el archivo local1 con uno
de los anteriores y ejecutando tambien svn resolved FILENAME.
1 mv
filename.rNEWVER filename
Usando svn revert Deshace los cambios que ha realizado para que pueda
volver a editar el archivo. No es necesario ejecutar svn resolved FILENAME.
3.5.
Una vez haya realizado todos los cambios pertinentes, puede subirlos usando
svn commit. Es necesario suministrar un mensaje para el historial. Puede
hacerlo como par
ametro:
$ svn commit --message "Nuevas modificaciones"
O tomando el mensage del contenido de un archivo:
$ svn commit --file logmsg
Y, en el caso de que no se especifique, se ejecutara el editor configurado por
defecto2 para que pueda escribir el mensaje. Puede ignorarlo y no guardar el
archivo (en cuyo caso se le preguntara si desea continuar) o dejarlo vaco.
4.
Examinar el historial
svn cat
creto:
5.
Otros comandos
6.
6.1.
Ramas
Qu
e es una rama?
Supongamos que tenemos un documento del que nos piden una copia con
algunas diferencias del original. Obviamente lo que se hace es crear una copia
sobre la que realizar los cambios, conservando el original. Se trabaja sobre ambos
archivos, modificando a veces uno, a veces otro.
Ahora imaginemos que hay un error en el archivo que es anterior a esta
divisi
on, por lo que posiblemente esta en ambas copias, que son practicamente
iguales, por lo que hay que realizar el mismo cambio en las dos.
Esta es la idea de una rama: archivos mantenidos de forma independiente
pero que comparten un pasado com
un. Una rama siempre empieza como una
copia de algo, pero teniendo su propio historial desde entonces.
6.2.
6.2.1.
Es tan f
acil como crear una copia.
$ svn copy trunk branches/mi_rama
Los datos no se duplican en el repositorio, as que no hace falta preocuparse por
un incremento de tama
no.
Nota: Por convenci
on suelen crearse bajo el directorio branches, pero puede
usarse cualquier otro: ramas, estable, etcetera.
6.2.2.
Puede hacerlo de forma normal, como un directorio mas del proyecto, aunque
es posible (como con todos los subdirectorios de un proyecto) de obtenerlo por
separado:
$ svn checkout svn://osl.uca.es/proyecto/branches/mi_rama
6.2.3.
Mientras que se trabaje con copias distintas no hay problema de que los
cambios se pisen, pero hay que tener en cuenta que conforme mas tiempo se
trabaje por separado, m
as difcil puede ser unir los cambios con el tronco del
proyecto sin que surjan multitud de conflictos.
Para aplicar los cambios realizados en la rama principal sobre la copia en las
que estamos trabajando se emplea el comando svn merge, muy similar a svn
diff, con la diferencia de que aplica los cambios en la copia de trabajo en lugar
de mostrar los cambios por consola, marcando el archivo como modificado.
$ svn merge svn://osl.uca.es/proyecto/trunk
Puede especificarse el directorio sobre el que aplicar los cambios.
$ svn merge svn://osl.uca.es/proyecto/trunk mi_rama
Una vez hecho esto puede actualizarse el repositorio indicando que se ha
aplicado una modificaci
on sacada de la rama principal.
$ svn commit --message "Importado los cambios desde trunk"
Para consejos sobre como usar estas funciones, consulte el captulo 4 de [4].
6.2.4.
Mantenimiento de ramas
/branches
/tags
Si contiene m
as se replica la estructura anterior:
/proyecto1/trunk
/proyecto1/branches
/proyecto1/tags
/proyecto2/trunk
/proyecto2/branches
/proyecto2/tags
En cualquier caso no es obligatorio, puede elegir la distribucion que mas le
guste.
Vida de los datos Una vez ha finalizado el trabajo en una rama y se han
integrado los datos en la rama principal, puede borrarse usando svn delete.
Otra utilidad de las ramas es cuando se quiere liberar una version estable,
por lo que hay que trabajar en solucionar bugs, pero sin dejar de a
nadir nuevas
funciones:
$ svn copy svn://osl.uca.es/proyecto/trunk
svn://osl.uca.es/proyecto/branches/estable-1.0
De esta forma se pueden seguir a
nadiendo caractersticas en /trunk y trabajar s
olo en solucionar errores en /branches/estable-1.0
7.
Administraci
on
7.1.
Utilidades
10
7.2.
Restaurar un repositorio
Pr
acticamente cualquier error - corrupcion de datos, cambios no deseados,...
- puede solucionarse empleando el comando svnadmin recover REPOSITORIO. Antes de ejecutarlo debe asegurase de que:
1. No haya ning
un proceso accediendo al repositorio.
2. Es el usuario propietario del repositorio. No solo como root, ya que es
posible que se generen de nuevo algunos archivos, y si se crean como root
no ser
an despues accesibles.
7.3.
8.
Configuraci
on del servidor
8.1.
svnserve
$ svnserve -d -r /usr/local/repositorios
De esta forma se accedera:
$ svn checkout svn://servidor/proyecto
8.1.1.
Autenticaci
on y autorizaci
on
Archivo de usuarios y realm En el archivo svnserve.conf, dentro del directorio conf/ del repositorio, bajo la seccion [general] se especifican: el archivo
que contiene los usuarios, el nombre de repositorio y los controles de acceso en
funci
on de si se es un usuario autentificado o no.
svnserve.conf
[general]
password-db = archivo_contrase~
nas # Ruta absoluta o relativa
realm = Ejemplo
anon-access = read # Los usuarios an
onimos s
olo pueden leer.
auth-access = write # Los usuarios registrados pueden escribir.
Los permisos pueden ser: none, sin acceso; read, solo lectura; write, lectura
y escritura.
nas (el indicado en password-db)
archivo contrase
[users]
juan = juanpasswd
ana = anapasswd
Puede ajustarse los permisos por directorios dentro de un repositorio, pero
eso no se cubrir
a en este documento.
SSH Lo c
omodo del metodo anterior es que no es necesario crear cuentas del
sistema por cada usuario, pero si se quiere aprovechar las cuentas de usuarios
puede usarse svnserve a traves de un t
unel SSH.
Basta con usar la ruta de la forma: svn+ssh://servidor/repositorio
Como en la forja se utiliza el metodo del archivo de usuarios por cada repositorio, si quiere m
as informacion sobre esta posibilidad, consulte [4]
8.2.
Apache httpd
LoadModule dav_module
LoadModule dav_svn_module
modules/mod_dav.so
modules/mod_dav_svn.so
O, en versiones m
as reciente, a traves de /etc/apache2/mods-enabled, creando en su interior enlaces simbolicos a los modulos dav.load y a dav svn.load
situados en /etc/apache2/mods-available.
Una vez hecho esto es necesario hacer accesible el repositorio, lo que se puede hacer de dos formas, o haciendo accesible u
nicamente el repositorio de un
proyecto o el directorio que contiene los repositorios de varios proyectos. Esta
segunda forma es la u
til en el caso de la forja. Para que Apache sepa que directorio debe hacer accesible, escriba en el archivo httpd.conf o apache2.conf
(dependiendo de la versi
on):
<Location /svn>
DAV svn
SVNParentPath /usr/local/repositorio
</Location>
8.2.1.
Autenticaci
on
Autenticaci
on HTTP b
asica Usando la utilidad htpasswd que proporciona Apache. Lo primero es a
nadir los usuarios y sus contrase
nas:
# Se pasa el par
ametro -c para crear el archivo.
# -m es para cifrar la contrase~
na usando MD5
$ htpasswd -cm /etc/svn-auth juan
New password: ****
Re-type new password: ****
Adding password for user juan
$ htpasswd -m /etc/svn-auth ana
New password: ***
Re-type new password: ***
Adding password for user ana
Una vez hecho esto, es necesario especificar en el fichero de configuracion
que se quiere emplear este fichero para la autenticacion:
<Location /svn>
DAV svn
SVNParentPath /usr/local/repositorio
AuthType basic
AuthName "Subversion"
AuthUserFile /etc/svn-auth
Require valid-user # Todas las conexiones deben ser identificadas
</Location>
14
Opciones de acceso
Referencias
[1] Apache httpd. http://httpd.apache.org/.
[2] Detailed description of unified format. http://www.gnu.org/software/
diffutils/manual/html node/Detailed-Unified.html.
[3] Webdav. http://www.webdav.org.
[4] C.Michael Pilato Ben Collins-Sussman, Brian W. Fitzpatrick. Version Control with Subversion. TBA, 2004.
15