Subversion: Introducción y comandos básicos

Subversion es un sistema de control de versiones diseñado específicamente para reemplazar al popular CVS.

Es software libre bajo una licencia de tipo Apache/BSD y se le conoce también como svn por ser el nombre de la herramienta utilizada en línea de comandos.

Que es un sistema de control de versiones?

Un sistema de control de versiones es un software que administra el acceso a un conjunto de ficheros, y mantiene un historial de cambios realizados. El control de versiones es útil para guardar cualquier documento que cambie con frecuencia, como una novela, o el código fuente de un programa.

Cómo funciona 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 conjunto 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.

Un repositorio de SVN tiene normalmente 3 carpetas/secciones diferentes.

Trunk: es donde se hacen la mayoría de los cambios, donde se hace el trabajo diario. Normalmente se le considera inestable en el sentido de que el código no se ha probado.

Tags: cuando el trunk es estable o se ha llegado a un hito importante se suele crear una etiqueta. Puedes ver las etiquetas como fotos de un proyecto. Una vez tomada es fija, no se deberían hacer cambios. Tags típicos son “0.3”, “RC 1”, etc.

Branches: cuando un desarrollador necesita implementar una característica de cierta magnitud que puede interferir demasiado con el trunk pero no quiere hacerlo en local (por ejemplo porque la caracteristica sea implementada en equipo) se puede crear una rama. Al contrario que las etiquetas, los desarrolladores actualizan continuamente las ramas hasta que el problema está resuelto o la nueva característica implementada. Una vez resuelto la rama se fusiona o combina con el trunk.

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.
  • Bloqueos: el usuario bloquea el fichero durante su edición, evitando el acceso concurrente de otros usuarios. Existen varios problemas: el usuario que acapara ficheros, el interbloqueo entre usuarios que necesitan varios ficheros, y la falta de concurrencia.

Bueno, y todo este lío para qué?

Supongamos que estamos haciendo un programa de cierto tamaño en colaboración con otra persona. Lo más primitivo es compartir cambios usando ficheros comprimidos. Pero este sistema es propenso a errores: ¿estamos enviando todo el código?, ¿estamos sobreescribiendo algún cambio?, ¿que ficheros debemos actualizar?, ¿quien tiene la versión maestra del código?

Todos los sistemas de control de versiones tienen ciertas características que acaban con estas preocupaciones. Esto es lo que aporta un sistema de control de versiones a un equipo:

  • Copias de seguridad centralizadas. Solo el administrador debe preocuparse de realizar copias de seguridad en el repositorio. Esto se automatiza fácilmente con una tarea cron o similares.
  • 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 ficheros, podemos volver atrás y recuperar su contenido.
  • Acceso remoto. Es posible acceder remotamente al repositorio. No es necesario que el equipo este dentro de la misma LAN.
  • Seguridad. Es posible otorgar diferentes permisos sobre diferentes ramas del proyecto. Por ejemplo, estableciendo permiso universal de lectura, y permiso de escritura solo a ciertos usuarios.
  • Actualiza ficheros modificados. El cliente recorre nuestro código y sincroniza nuestra copia local con el repositorio.

Los clientes de SVN

Existen infinidad programas clientes svn, muchos de ellos escritos nativamente para el SO en cuestión, en mac por ejemplo está Versions (en windows es muy popular TortoiseSVN), lo puedes encontrar integrado en editores de código como Coda, o aplicaciones FTP por ejemplo Transmit, también puedes encontrar cientos de plugins para tus aplicaciones que incorporan funcionalidades desvn. De todas formas y dado a su facilidad de uso, creo que vale la pena aprender a usarlo vía Terminal ya que ganaremos en eficiencia y rapidez y no tendremos que instalar nada en nuestro sistema.

SVN, en mac OSX

Mac OSX lleva ya instalado por defecto un cliente svn integrado en Apache, veamos que versión; abre el terminal y escribe:

svn --version

Debería salir algo como esto:

svn, version 1.6.5 (r38866)
compiled Jun 24 2010, 17:16:45

Copyright (C) 2000-2009 CollabNet.
Subversion is open source software, see http://subversion.tigris.org/
This product includes software developed by CollabNet (http://www.Collab.Net/).

Suficiente para descargarnos cualquier repositorio, trabajar en él de forma local, actualizar el repositorio maestro, volver a versiones anteriores, etc etc,

Comandos básicos de SVN

Checkout (co)

Nos sirve para descargar en nuestro ordenador cualquier repositorio accesible, por ejemplo, descarguémonos WordPress (http://wordpress.org/download/svn/):

svn co http://core.svn.wordpress.org/trunk/ ~/Desktop/Wordpress/

Esto lo que hará es descargarnos el repositorio (en este caso público) de WordPress en una carpeta en el escritorio que se llamará WordPress (si no la hemos creado svn lo hará por nosotros). En repositorios públicos como al que acabamos de acceder tendremos acceso libre para descargarnos el repositorio, mantenerlo actualizarlo (los archivos core) y poca cosa más.

En un proyecto propio, deberíamos acceder al repositorio con el usuario y password que el administrador nos haya facilitado, de esta manera:

$ svn checkout https://rutaalrepositorio nombredelproyecto --username=usuario

Y a continuación el password. También puedes acceder por ssh:

svn+ssh://usuario@rutaalrepositorio rutacarpeta

A continuación el password.

De esta manera no solamente tenemos acceso a mantener actualizado nuestro repositorio sino que a medida que vayamos trabajando podemos ir subiendo revisiones de forma colaborativa con otros participantes.

Commit (ci)

Al hacer un commit lo que hacemos es enviar todos los cambios que hemos realizado sobre nuestra copia local del repositorio, ya sea la modificación de algún archivo, algún archivo que hayamos añadido o eliminado, algo que hayamos movido de sitio o cambiado el nombre, etc. Por ejemplo:

$ svn commit -m 'Esta es una descripción de los cambios realizados'

Los cambios se aplicarán al contenido de la carpeta donde nos encontremos, pero también podemos decir que sólo suba archivos o carpetas concretas:

$ svn ci image1.jpg image2.png ./css -m 'Cambios en imagen1 y 2 y hojas de estilo'

Veremos la impresion:

Sending image1.jpg
Sending image2.png
Sending css/style-media.css
Sending css/style-print.css
Transmitting file data ....
Committed revision 934.

Add (add)

Cuando agregamos un archivo nuevo a nuestro proyecto, para que el repositorio lo tenga en cuenta se usa add:

$ svn add changelog.txt

Imprime:

A changelog.txt

Al igual que hemos echo con commit, podemos agregar archivos separados en rutas diferentes, carpetas enteras, etc. Eso sí, para que los cambios tengan efecto deberemos hacer un commit después.

Move (mv)

Para mover archivos o carpetas de lugar o cambiarles el nombre:

$ svn mv changelog.txt cambios.txt

Imprime:

A cambios.txt
D changelog.txt

Qué significan la A y la D que aparecen? Lo vemos en status.

Delete, remove (del, rm)

Para eliminar un archivo o carpeta del repositorio:

$ svn rm cambios.txt

Imprime:

D cambios.txt

Status (st)

Sirve para ver el estado en que se encuentra nuestra copia en comparación con el repositorio, si nos falta actualizar, eliminar o añadir algún archivo.

Como siempre podremos referirnos a el proyecto entero, a una carpeta concreta o a un archivo concreto o varios de ellos.

$ svn st

Imprime:

? Icon
D cambios.txt
A images/image1.jpg
A images/image2.png
M css/style-media.css
M css/style-print.css
A images/caracola.txt

Subversion nos dirá que es lo que encuentra, veamos los casos más relevantes:

  • A un archivo que hemos agregado al repositorio (add)
  • M una modificación que hemos echo
  • D un archivo que hemos eliminado (rm, del)
  • C conflictos con update
  • ? un archivo que hemos añadido pero que no hemos agregado al repositorio con add.
  • ! un archivo que se ha eliminado (manualmente) y el repositorio no lo encuentra

Update (up)

Este comando sirve para actualizar tu repositorio local con los cambios que se hayan echo en el repositorio remoto (maestro). Debes saber que cualquier sistema de control de versiones nunca sobrescribirá las modificaciones que tu hayas echo, siempre intentará combinarlas, para que tengas los últimos cambios echos por todos los integrantes incluido tus cambios.

$ svn up

Imprimirá algo como:

A cambios.txt
M changelog.txt
At revision 935.

Bueno, por el momento eso es todo, me gustaría escribir otro artículo para explicar cómo crear un repositorio y algunos comandos y conceptos más complejos. A continuación dejo unas referencias que pueden ser de utilidad.

Fuentes

http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html
http://es.wikipedia.org/wiki/Subversion
http://polaris.dit.upm.es/~rubentb/docs/subversion/TutorialSubversion/index.html
http://svnbook.red-bean.com/
http://www.loqueyosede.com/svn/Lo-que-yo-se-de-SVN.pdf
SVN Textmate Bundle

Advertisements

One thought on “Subversion: Introducción y comandos básicos

  1. Pingback: Moving to GitHub | Coding Something…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s