
Cuando tenemos cualquier documento que cambia con frecuencia, es muy útil utilizar un sistema de control de versiones.
Porqué usar un sistema de control de versiones:
- Imprescindible si trabajan varias personas en un mismo código, para evitar sobreescribir el trabajo del otro. También podemos asignar permisos a diferentes ramas del proyecto.
- Aunque se trabaje solo, con él podemos llevar un control sobre las versiones de nuestro trabajo. En caso de haber realizado un cambio que no ha resultado bien, podemos volver a una versión anterior fácilmente, y sin tener que recordar esos cambios.
- Acceso remoto: no necesitamos el código en nuestra máquina, ni siquiera en nuestra LAN.
- Podemos guardar copias de seguridad fácilmente.
Existen multitud de sistemas de control de versiones, pero el más conocido y usado hoy en día es el Subversion. Es open source y tiene todas las características que necesitaremos. Manual oficial.
Pequeña guía de uso
Funcionamiento general: Necesitaremos tener instalados el svn en los clientes y svnadmin en el servidor (aunque pueden ser la misma máquina). El servidor contiene la copia principal (repositorio), y los clientes se descargan una copia para trabajar localmente. Una vez realizados los cambios se actualiza el repositorio.

En el servidor crear repositorio:
mkdir /home/jesus/svn-repos
svnadmin create /home/jesus/svn-repos
Ahora podemos crear ahí las carpetas y archivos necesarios.
Normalmente se utiliza una carpeta llamada trunk para la principal línea de desarrollo, una carpeta branches para las versiones en producción y sus bugfixes, y una carpeta tags para guardar versiones específicas (por ej. la versión 5.0).
Para acceder al repositorio podemos hacerlo de varias formas:
- file:///path si el repositorio está en nuestro equipo.
- svn://servidor/path si el repositorio está en nuestra LAN.
- svn+ssh://servidor/path si trabajamos a través de internet. Necesitaremos tener configurado ssh en el servidor.
También podremos hacerlo con http:// o https:// pero no son tan seguros.
Imaginemos que tenemos en nuestra máquina un proyecto y que queremos subirlo a un servidor donde se encuentra el repositorio:
svn import ./localproject svn+ssh://usuario@server.com/home/usuario/svn/project/trunk -m "Primer import"
Si queremos bajar un proyecto del repositorio (check out):
svn co file:///home/jesus/svn-repos/project/trunk ./localproject
para recuperar la versión 7 específica añadimos -r 7. No confundir éstas versiones (cambios) con las de branches (releases).
Para actualizar el repositorio cuando tenemos los cambios (commit – check in):
svn ci -m "mensaje informativo"
Si alguien lo ha modificado antes que nosotros deberemos antes actualizar (update):
svn up
Comprobar estado de los ficheros de nuestra copia local (status):
svn st
Nos mostrará los ficheros modificados con un M delante, los ficheros con conflictos con una C, los que no están bajo svn con un ?, etc…
Los ficheros con conflictos deberemos corregirlo e indicar que está arreglado con:
svn resolved fichero
Para ver las diferencias entre ficheros locales y los del repositorio:
svn diff fichero
Si queremos ver la diferencia entre vesiones:
svn diff -r19:21 fichero
Para ver los cambios ocurridos en el repositorio:
svn log
Si realizamos cambios en la estructura de ficheros en nuestra copia local, debemos indicárselo al subversion con copy, delete, move o add.
svn copy file1.txt file2.txt
Por ejemplo si hemos creado un fichero file.txt sin el svn add, a la hora de hacer el commit ese fichero no será subido al repositorio hasta que no pongamos svn add file.txt
Si añadimos un directorio por defecto añade también sus archivos. Si hemos añadido varios ficheros y/o directorios podemos indicarlo recursivamente.
svn add *
Realizar copia de seguridad:
svnadmin dump path/to/repository | gzip > dumpfile.gz
Recuperar copia de seguridad:
gunzip -c dumpfile.gz | svnadmin load path/to/repository
Para crear una imagen que no incluya versiones ni nada, por ejemplo cuando subamos la aplicación a producción:
svn export svn+ssh://usuario@server.com/home/usuario/svn/project/trunk /local/path












