Subversion
Subversion
Subversion
Qu es Subversin ?
Es un sistema de control de versiones libre y de cdigo fuente abierto. Maneja tanto ficheros como directorios a travs del tiempo. Hay un rbol de ficheros en un repositorio central. El repositorio es como un servidor de ficheros ordinario, excepto porque recuerda todos los cambios hechos a sus ficheros y directorios.
Websvn
# apt-get install websvn enscript enscript : converts text to Postscript, HTML or RTF with syntax highlighting.
Componentes de Subversin
Dentro de subversin trae varios programas : svn = El programa cliente de lnea de comandos. svnversion = Programa para informar del estado (en trminos de revisiones de los elementos presentes) de una copia de trabajo. svnlook = Una herramienta para inspeccionar un repositorio de Subversin. svnadmin = Herramienta para crear, modificar o reparar un repositorio de Subversin. svndumpfilter = Un programa para filtrar el formato de salida de volcado de repositorios Subversin. mod_dav_sun = Un mdulo para servidor HTTP Apache usado para hacer que su repositorio est disponible a otros a travs de una red. svnserve = Un servidor independiente, ejecutable como proceso demonio o invocable por SSH; otra manera de hacer que su repositorio est disponible para otros a travs de una red.
Estructura de proyectos
Los proyectos seguirn la estructura habitual de Subversin, es decir tendrn los siguientes tres directorios: trunk: Directorio con el HEAD del desarrollo. Es donde se realiza el trabajo del da a da. branches: Directorio donde se almacenan las distintas ramas (branches) que se crean a partir del trunk. tags: Directorio donde se almacena copia del repositorio con un nombre de etiqueta concreto. Esto no es realmente necesario porque los nmeros de revisin en Subversion se aplican a todo el repositorio, por lo que sabiendo el nmero de revisin se tiene un
snapshot del repositorio en ese momento. Este directorio existe por conveniencia para dar nombres ms legibles de cara al humano, por ejemplo v1.0.3. En este directorio nunca se debera hacer commit.
Acceso al Repositorio
Esquema file:/// http:// https:// svn:// snv+ssh:// Mtodo de acceso Acceso directo al repositorio (en disco local). Accesso va protocolo WebDAV a un servidor Apache que entiende de Subversin. Igual que http://, pero con cifrado SSL. Acceso va un protocolo personalizado a un servidor svnserver. Igual que svn://, pero a travs de un tnel SSH.
Ahora podemos borrar el directorio ~/proyectos/GPSGPRSComm-6.0L ya no nos hace falta, ya que importamos por svn para poder trabajarlo. Si queremos listar lo que contiene nuestro sistema versionado ejecutamos : # svn list http://127.0.0.1/svn Para comenzar a manipular los datos del repositorio, necesitamos crear una copia de trabajo de los datos, una especie de entorno de trabajo privado. Para eso le indicamos a svn que realice dicha copia de la rama trunk. # svn checkout http://127.0.0.1/svn projectos si tenemos un usuario se lo indicamos poniendo : --username NOMBRE_USUARIO # svn checkout --username NOMBRE_USUARIO http://127.0.0.1/svn projectos Ahora disponemos de una copia personal de parte del repositorio en un nuevo directorio llamado projectos. Podemos editar los ficheros en su copia de trabajo y despus depositar esos cambios de nuevo en el repositorio. Entrar en la copia de trabajo y editar los contenidos de los ficheros. Ejecutar svn diff para ver las diferencias introducidas por sus cambios en formato diff unificado. Ejecutar svn commit para depositar la nueva versin de su fichero en el repositorio. Ejecutar svn update para sincronizar su copia de trabajo con el repositorio.
Ejemplo : U foo.c U bar.c Updated to revision 2. U foo.c = El fichero foo.c fue Updated (recibidos cambios del servidor). A foo.c = El fichero o directorio foo.c fue Added a su copia de trabajo local. D foo.c = El fichero o directorio foo.c fue Deleted de su copia de trabajo local. R foo.c = El fichero o directorio foo.c fue Replaced en su copia de trabajo local; esto es, foo.c fue borrado, y un nuevo objeto con el mismo nombre fue aadido. Mientras pueden tener el mismo nombre, el repositorio los considera objetos distintos con historiales distintos. G foo.c = El fichero foo.c recibi nuevos cambios del repositorio, pero su copia local del fichero tena sus modificaciones. O los cambios no se tocaron, o los cambios eran exactamente iguales que sus modificaciones locales, as que Subversin ha merGed satisfactoriamente los cambios del repositorio al fichero sin ningn problema. C foo.c = El fichero foo.c recibi cambios Conflicting del servidor. Los cambios del servidor directamente se superpusieron sobre sus propios cambios en el fichero. Aunque no hay necesidad de aterrarse. Esta superposicin necesita ser resuelta por un humano (usted); tratamos esta situacin ms tarde en este captulo.
? archivo_o_directorio = El archivo_o_directorio no est bajo control de versiones. Puede silenciar la marca de pregunta pasando la opcin --quiet (-q) a svn status, o poniendo la caracterstica svn: ignore en el directorio padre. Para ms informacin sobre ficheros ignorados. ! archivo_o_directorio = El archivo_o_directorio est bajo el control de versiones pero falta o est de alguna manera incompleto. El objeto puede faltar si se ha borrado usando un comando ajeno a Subversin. En el caso de un directorio, puede estar incompleto si ha interrumpido una descarga o una actualizacin. Un rpido svn update responder el fichero o el directorio desde el repositorio, o svn revert file restaurar un archivo que falta. ~ archivo_o_directorio = El archivo_o_directorio est en el repositorio como un tipo de objeto, pero actualmente est en su copia de trabajo como otro tipo. Por ejemplo, Subversin puede tener un fichero en el repositorio, pero usted borr el fichero y cre un directorio en su lugar, sin usar los comandos svn delete o svn add. I archivo_o_directorio = Subversin est ignorando el archivo_o_directorio, probablemente porque usted se lo dijo. Observe que este smbolo solo aparece si le pasa la opcin --no-ignore a svn status.
La segunda columna dice el estado de las propiedades de un fichero o un directorio. Si aparece una M en la segunda columna, entonces las propiedades han sido modificadas, si no es un espacio en blanco ser impreso. La tercera columna solo mostrar un espacio en blanco o una L la cual significa que Subversin ha bloqueado el objeto en el rea de trabajo .svn. Usted ver una L si ejecuta svn status en un directorio donde un svn commit est en progreso quizs cuando est editando el informe de cambios. Si Subversin no se est ejecutando, entonces probablemente Subversin fue interrumpido y el bloque necesita ser eliminado ejecutando svn cleanup. La cuarta columna solo mostrar un espacio en blanco o un + el cual significa que el fichero o directorio est programado para ser aadido o modificado con historial adicional adjunto. Esto ocurre tpicamente cuando usted svn move o svn copy un fichero o directorio. Si usted ve A + , esto significa que el objeto est programado para la adicin-con-historial. Este puede ser un fichero, o la raz de un directorio copiado. + significa que el objeto es parte de un subrbol programado para la adicin-con-historial,p.e.algn padre fue copiado,M + significa que el objeto es parte de un subrbol programado para la adicin-con-historial, y este tiene modificaciones locales. Cuando enve los cambios, primero el padre ser aadido-con-historial (copiado), lo que significa que este fichero existir automticamente en la copia. Entonces las modificaciones locales sern enviadas al repositorio. La quinta columna solo mostrar un espacio en blanco o una S. Esto significa que el fichero o directorio ha sido movido de la ruta del resto de la copia de trabajo (usando svn switch) a una rama. # svn status verbose o # svn status -v
Ver diferencias
Puedo ver la diferencia del archivo que estoy modificando con el de la ultima version comiteada. # vi archivo_1.c # svn diff Index: archivo_1.c ==================================================== --- archivo_1.c (revisin: 3) +++ archivo_1.c (copia de trabajo) @@ -1 +1,3 @@ #include <stdio.h> + +#include <mio.h> Las lineas quitadas se muestran con un - (menos) y las agregadas con un + (mas). Con esta salida podemos armar un parche. # svn diff > archivo_patch.patch
Nos ubicamos dentro del directorio de trabajo. # svn log --username USUARIO NOMBRE_ARCHIVO Puedo obtener informacion de una revision determinada : # svn log -r 71 --username USUARIO NOMBRE_ARCHIVO Puedo obtener informacin de un rango de revisin determinada : # svn log -r 71:79 USUARIO NOMBRE_ARCHIVO Puedo obtener informacin de un rango de revisin determinada, para mas informacin lo veo poniendo la opcin --version (-v): # svn log -r 71:79 -v USUARIO NOMBRE_ARCHIVO
Realizar copia
Para realizar una copia de un archivo del repositorio a otro, esto crea un nuevo objeto.
# svn copy archivo_1.c archivo_2.c # vi archivo_2.c # svn commit -m Copia de archivo_1.c a archivo_2.c
Crear directorio
# svn mkdir mi-directorio
Mover
Esto funciona igual que svn copy archivo_1.c ; svn delete archivo_1.c # svn move archivo_1.c archivo_2.c A archivo_2.c D archivo_1.c # vi archivo_2.c # svn commit -m Movie de archivo_1.c a archivo_2.c
Borrando un archivo
Puedo borrar un archivo del repositorio. # svn delete archivo_1.c Luego para que quede elevado tengo que hacerle un commit y poner un comentario. # svn commit -m Es un ejemplo de borrado
@@ -1 +1,3 @@ Esto es una prueba + +Prueba 2 Marcos # svn merge -r 88:89 https://127.0.0.1/svn/Proyecto2 U Mauro_3.txt # svn status M Mauro_3.txt # svn commit -m Mauro_3.txt: pasado a version 89 Con esto genera una nueva versin de Mauro_3.txt siendo la 90.
Realizar un backup
# svnadmin dump /svn/Proyecto1 > respaldo-proyecto1 # file respaldo-proyecto1 respaldo-proyecto1: Subversion dumpfile (version: 2) Para restaurar : # svnadmin load /svn/Proyecto1 < respaldo-proyecto1
Configuracin de websvn
Podemos reconfigurar en debian mediante dpkg-reconfigure : # dpkg-reconfigure websvn
o bien tocando los archivos de configuracin : # vi /etc/websvn/svn_deb_conf.inc <?php // please edit /etc/websvn/config.php // or use dpkg-reconfigure websvn // php is default correctly colourized $extEnscript[".java"] = "java"; $extEnscript[".pl"] = "perl"; $extEnscript[".py"] = "python"; $extEnscript[".sql"] = "sql"; $extEnscript[".java"] = "java"; $extEnscript[".html"] = "html"; $extEnscript[".xml"] = "html"; $extEnscript[".thtml"] = "html"; $extEnscript[".tpl"] = "html"; $extEnscript[".sh"] = "bash"; // Number of spaces to expand tabs to in diff/listing view across all repositories $config->expandTabsBy(8); $config->parentPath("/svn/"); $config->setEnscriptPath("/usr/bin"); $config->setSedPath("/bin"); $config->useEnscript();
Configuracin de Apache2/SSL
Creamos el certificado : # mkdir /etc/apache2/ssl # RANDFILE=/dev/random openssl req $@ -new -x509 -days 365 -nodes \ -out /etc/apache2/ssl/apache.pem -keyout /etc/apache2/ssl/apache.pem # chmod 600 /etc/apache2/ssl/apache.pem Creamos la asignacin de la pagina # vi /etc/apache2/sites-available/svn <VirtualHost *:80> RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*) https://%{SERVER_NAME}/websvn/ [L,R,Nc] </VirtualHost> # vi /etc/apache2/sites-available/svn-ssl NameVirtualHost *:443 <VirtualHost *:443>
DocumentRoot /usr/share/websvn ServerAdmin webmaster@localhost # SSL Engine Switch: # Enable/Disable SSL for this virtual host. SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.pem # Configuration for websvn using php4. Alias /websvn /usr/share/websvn <Directory /usr/share/websvn> DirectoryIndex index.php Options FollowSymLinks Order allow,deny Allow from all <IfModule mod_php4.c> php_flag magic_quotes_gpc Off php_flag track_vars On </IfModule> </Directory> ErrorLog ${APACHE_LOG_DIR}/svn-error-ssl.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/svn-access-ssl.log combined <Location /> AuthType Basic AuthName "My Subversion Repository" AuthUserFile /etc/apache2/dav_svn.passwd Require valid-user </Location> </VirtualHost> # vi /etc/apache2/httpd.conf Servername 127.0.0.1 Creamos el archivo de password dav_svn.passwd # htpasswd -c /etc/apache2/dav_svn.passwd usuario1 Activamos el nuevo sitio. Esto lo hacemos realizando un "sym-link" a la configuracin de etc/apache2/sites-enabled/. El comando que nos brinda apache para realizar esto, es: # a2ensite svn
# a2ensite svn-ssl Para activar el mdulo ssl y rewrite , hacemos: # a2enmod ssl # a2enmod rewrite Reiniciamos el servidor de apache : # /etc/init.d/apache2 restart