Subversion y sus mejores recetas

En este primer artículo haré un repaso a los comandos más comunes de subversion y a su utilización en un escenario real. Empezando desde la creación del repositorio hasta la generación de una nueva release para su salida a producción. En otros artículos extenderé la temática al empleo de ramas paralelas de desarrollo y la configuración de servidores locales y remotos de subversion. Empecemos por el principio

*Crear un nuevo repositorio*

$ sudo mkdir /var/svn
(creamos el directorio para albergar nuestros repositorios)
$ sudo chown $USER.$USER /var/svn
(asignamos este directorio al usuario actual para evitar problemas de permisos)

$ svnadmin create /var/svn/newrepos
(creamos un nuevo repositorio en /var/svn/newrepos
$ svn list file:///var/svn/newrepos
(listamos los ficheros incluidos en este repositorio, vacío de momento)

*Importar ficheros al repositorio*

$ mkdir -p tmp/branches tmp/tags tmp/trunk
(creamos los primeros directorios para introducir en el repositorio)
$ svn import tmp file:///var/svn/newrepos/myproject -m «Importación inicial»
(importamos el contenido del directorio tmp al repositorio dentro de la carpeta myproject con el commentario Importación inicial. myproject no es un directorio real dentro del sistemas de archivos es gestionado internamente por subversion)

*Preparar nuestra copia de trabajo*

$ mkdir myproject
(creamos el directorio donde situaremos nuestra copia de trabajo)
$ svn checkout file:///var/svn/newrepos/myproject/trunk .
(obtenemos los ficheros del directorio trunk del repositorio, en nuestro caso aún está vacío)

*Añadir nuevos ficheros a nuestro proyecto*

$ vi README
(creamos un nuevo fichero dentro de la copia de trabajo)
$ svn add REAME
(añadimos el fichero a los programados para ser añadidos al repositorio)
$ svn commit -m «Añadimos primer fichero README»
(enviamos los cambios al repositorio añadiendo el fichero README al mismo, el texto entrecomillado después del -m es un comentario sobre este envío)

*Sincronizando con el repositorio*

$ svn update
(Sincronizando con el contenido del repositorio por si hay cambios en los ficheros)

*Copiar ficheros*

$ svn copy README README2
$ svn commit -m «README copiado a README2»

*Mover ficheros*

$ svn move README2 README3
$ svn commit -m «Moviendo README2 a README3»

*Borrar un fichero*

$ svn del README3
$ svn commit -m «Borrando README3»

*Creando un nuevo directorio*

$ svn mkdir src
$ svn commit -m «Creando directorio src»

Comandos de apoyo

$ svn log
(registro de cada cambio hasta el último svn update ejecutado)
$ svn list
(Lista de ficheros hasta el último svn update ejecutado)
$ svn status
(Lista de tareas programadas para el siguiente commit basados en los cambios efectuados en la copia actual. Leyenda: A – fichero a añadir, D – fichero a borrar, C – conflictos con respecto al repositorio, M – Modificaciones locales, ? fichero no controlado por el sistema de versionado)

*Modificar ficheros ya existentes y analizar cambios*

$ vi README
(editamos README modificando su contenido)
$ svn diff
(vemos los cambios en ficheros)
$ svn commit -m «Modificaciones en README»

*Deshacer modificaciones en tu copia de trabajo*

$ vi README
(editamos README e introducimos algún error)
$ svn diff
(observamos de nuevo estos cambios en README)
$ svn revert README
(deshacemos las modificaciones sobre README, revert es capaz de deshacer cualquier modificación programada para el siguiente commit)

Tratamiento de conflictos

*Anticipando posibles problemas antes de actualizar tu copia de trabajo*

$ svn update -u

*Actualizando con el repositorios (este retorna coflictos)*

$ svn update
U INSTALL
G README
Conflict discovered in ‘bar.c’.
Select: (p) postpone, (df) diff-full, (e) edit,
(h) help for more options:

Desde la versión 1.5 de subversion (interactive conflict resolution)

U (UPDATED) – fichero actualizado del repositorio (cambios sólo en el repositorio)
G (MERGED) – fichero actualizado del repositorio y con cambios locales combinados automáticamente
Conflict discovered in ‘xxxx’ – fichero actualizado en el repositorio y con cambios locales que se solapan. Hay que proceder a resolver el problema. Atención mientras no se resuelva el conflicto no se puede hacer commit de tus cambios al repositorio.

Las opciones son:

postpone – Deja en la copia local 3 archivos para ayudarte a resolver el conflicto. Suponiendo que el fichero en conflicto se llama filename estos son los 3 ficheros filename.mine (la versión en tu copia de trabajo), filename.r (la versión base de tu copia de trabajo, es decir, la del último update exitoso o en su defecto tu checkout), filename.r (la versión head del repositorio). Además filename incluye ahora el diff entre las dos versiones. La manera de resolver es:

*Si quieres aceptar los cambios procedentes del repositorio y eliminar tus cambios*

$ svn revert

ó

$ svn resolve –accept theirs-full filename

*Si quieres subir tu versión y eliminar los cambios que hayan llegado con el update*

$ svn resolve –accept mine-full filename

Recuerda que svn resolve eliminará las diferentes versiones del fichero conflictivo en tu copia de trabajo

*Si se editan los cambios*

$ vi filename
(se corrigen manualmente los conflictos)
$ svn resolve –accept working filename
(Se resuelve el conflicto)

$ svn commit -m «Conflicto resuelto en filename»
(Tras la resolución se envían los cambios al repositorio)

diff-full – Te devuelve las diferencias
edit – Edita directamente el archivo con las diferencias para resolver el conflicto desde este menu interactivo
resolved – Después de editarlo se declara el conflicto como resuelto
mine-full – Acepta tus cambios y elimina los procedentes del update
theis-full – Elimina tus cambios y acepta los procedentes del update
launch – Ejecuta un programa externo para resolver el conflicto (necesita preparación previa, introducir la variable de entorno SVN_MERGE o definir merge-tool-cmd en los ficheros de configuración de subversion. Al programa se le pasaran 4 ficheros (base, update, working y diff)
help – Muestra la lista de comandos disponibles

*Enviando tus modificaciones*

$ svn commit -m «Modificaciones»
(Envia los cambios de tu copia de trabajo al repositorio, si hay problemas y no se pueden enviar los cambios debes ejecutar un svn update para resolver conflictos tal y como comentaba previamente)

*Ver el contenido de un fichero en una versión en particular*

svn cat -r 3 README
(svn cat -r

*Registro de cambios de una revision*

$ svn log -r 4
(svn log -r )

*Registro de cambios entre revisiones*

$ svn log -r 3:5
(svn log -r :)

*Comparando tu copia de trabajo con el repositorio*

$ svn diff -r 3 README
(svn diff -r )

*Comparando distintas versiones del repositorio*

$ svn diff -r 3:4 README
(svn diff -r :

*Devolviendo fichero del repositorio*

$ svn cat -r 3 README
(svn cat -r

*Crear una copia de trabajo de una versión antigua de tu repositorio*

$ svn checkout -r 3
(svn checkout -r )
Atención, no se pueden enviar cambios desde esta copia de trabajo

*Actualizar tu copia de trabajo a una versión antigua de tu repositorio*

$ svn update -r 3 file:///var/svn/mirepo .
(svn update -r )
Atención, no se pueden enviar cambios desde esta copia de trabajo

*Generar release*

$ svn export file:///var/svn/newrepos/myproject/trunk

*Geneare release de una versión en particular*

$ svn export file:///var/svn/newrepos/myproject/trunk -r 3

Si os ha resultado útil esta artículo aquí tenéis otro con la 2ª parte sobre subversión.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *