SUBVERSION Subversion es un servicio encargado de controlar el desarrollo de los distintos proyectos que se crean en una empresa de desarrollo de software. Este programa nace con el objetivo en mente de sustituir a CVS (Concurrent Versioning System), el cual se ha demostrado que tiene bastantes carencias y limitaciones. Es un sistema de control de versiones libre. Su licencia es la Apache 1.1. Subversion se encarga de mantener un árbol histórico de ficheros y directorios a lo largo del tiempo. Esta idea no es nueva y tampoco se está reinventando la rueda, simplemente se está mejorando. Al parecer, en el año 2000 los desarrolladores de CollabNet estaban realmente quemados por los problemas que causaba el uso de CVS (cuya idea se fraguó en 1985) en su suite de desarrollo SourceCast. Fue en ese año cuando comenzaron a buscar programadores para el diseño e implementación de Subversion con la idea en mente de mejorar CVS y sustituirlo como componente de SourceCast en favor de Subversion. Allá por Febrero de 2000 el grupo CollabNet contactó con Karl Fogel, un hombre que llevaba años ofreciendo el servicio de CVS a empresas para controlar sus desarrollos junto a su amigo Jim Blandy. El segundo permitió al primero dedicarse enteramente al proyecto Subversion de manera indefinida. El número de desarrolladores creció debido a que el proyecto atrajo a mucha gente que compartía los mismos deseos: mejorar CVS. Así, después de poco más de un año de programación, los desarrolladores de Subversion empezaron a usar su propio sistema en lugar de CVS, que era lo que usaban hasta ese momento. Algunas de las características que hacen de Subversion un digno sucesor de CVS son: ✔ Histórico de directorios: a diferencia de CVS, la nueva implementación permite mantener un histórico de directorios creados, renombrados y/o borrados. ✔ Histórico real de archivos: CVS guardaba todos los cambios realizados sobre un archivo en un fichero de texto. Esto representaba un serio problema porque a la hora de, por ejemplo, crear un fichero con el nombre de otro que ya existía, se heredaba el histórico del fichero viejo aunque ya no tuvieran nada en común. Eso ha dejado de ocurrir: ahora cualquier operación que incluya copiado, renombrado, borrado o añadido tendrá su propio histórico. ✔ Consistencia de los datos almacenados: Subversion maneja de igual manera ficheros de texto y binarios: hace uso de un algoritmo de "diferenciación" que permite compresión de los datos dentro del repositorio y, además, se apoya en una base de datos BDB (Berkeley DB). ✔ Transacciones: Igual que en el banco cuando efectuamos una operación, en Subversion las modificaciones del repositorio se realizan completas o no se realizan. O se realizan todos los pasos o no se realiza ninguno. Nunca se quedará un commit a mitad. ✔ Modificable: Subversion ha sido diseñado de forma que cualquier modificación no conlleve demasiado esfuerzo: consiste básicamente en una serie de APIs bien definidas programadas en varias librerías compartidas. Miniguía para nuestro proyecto. Crear un proyecto # svnadmin create bmserver Crea el proyecto en /var/svn/bmserver Importar el proyecto # svn import . file:///var/svn/bmserver --message “import inicial” Añade los ficheros fuente que tengamos en el directorio actual “.” al repositorio de subversion, esto se hace la primera vez, cuando se crea el proyecto. Obtener una copia inicial del proyecto para empezar a trabajar $ svn checkout file:///var/svn/bmserver . $ svn checkout svn://lcg.zapto.org/bmserver . Sincronizar última versión SVN –> local (bajar última versión) $ svn update Sincronizar cambios desde local –> SVN (subir modificaciones) $ svn commit Actualiza sólo los ficheros que han sufrido cambios. Obligatorio poner el mensaje del concepto de la actualización. Conviene hacerlo bastante, no una vez al día, sino cada cambio interesante. Ver los cambios que hemos hecho y que se van a subir en el commit $ svn status Ver histórico de cambios $ svn log Muestra todos los cambios $ svn log main.cpp Muestra los cambios en un fichero concreto. Ver los ficheros que hay en el repositorio $ svnlook tree /var/svn/bmserver Ver la información del proyecto actual $ svn info (sólo administrador) Trabajo con ficheros $ $ $ $ svn svn svn svn add pp.cpp delete pp.cpp copy origen.cpp destino.cpp move origen.cpp destino.cpp Usaremos estos comandos para que SVN se entere de que un fichero es copia o ha sido movido y que no piense que es uno nuevo. Si no hacemos el delete, no borraría el fichero del repositorio SVN. Estas acciones se actualizan en el servidor SVN al hacer el commit. Se puede ver lo que hay pendiente con el status. $ svn revert main.cpp Deshace los cambios hechos a un fichero. $ svn commit Subirá los cambios realizados al repositorio SVN. Obligatorio poner descripción. La descripción debe ser concisa y descriptiva de los cambios realizados. $ svn update Actualizamos nuestra copia local a la versión actual. $ svn checkout --revision 2 Nos permite actualizar a una versión antigua. Manual de Subversion: http://svnbook.red-bean.com/svnbook/ Instalación de Subversion 1. Añadir a las fuentes de apt la siguiente línea deb http://people.debian.org/~adconrad woody subversion 2. Descargar Subversion borrando antes CVS si lo tenemos instalado # apt-get --purge remove cvs # apt-get install subversion 3. Arrancar Subversion como demonio en el servidor de repositorio # svnserve -d -r /var/svn/ 4. Configurar el modo de autentificación y crear los usuarios para SVN Los ficheros de configuración son para cada proyecto. Vamos a editar el fichero de configuración del proyecto bmserver $ vi /var/svn/bmserver/conf/svnserve.conf Inicialmente está todo comentado, así que lo mejor podría ser irse al final del fichero y añadir: [general] anon-access = none auth-access = write realm = BomberMan password-db = userfile <<<<- No permitiremos accesos anónimos Los usuarios pueden leer y escribir Nombre del proyecto Fichero de usuarios y passwords Ahora creamos el fichero “userfile” donde especificaremos los usuarios y sus contraseñas. Obviamente estos usuarios no son del sistema ;-D $ vi /var/svn/bmserver/conf/svnserve.conf [users] leo = yngwie manolo = malmsteen No hace falta reiniciar svnserve. Ahora al hacer accesos al servidor nos pedirá contraseña. Sólo pide auth la primera vez, luego usa auth-cache Toma como usuario el $USER del sistema. Se puede especificar un usuario distinto con –username “NOMBRE”