2.07.2006

Usa subversion por favor

Cuando llevas ya algún tiempo manejando código te das cuenta del caos que puede llegar a ser el no tener un control muy métodico del mismo e incluso teniendolo pueden surgir problemas que hagan que un trabajo de días se vaya a la mierda o que gastes horas en saber "como pichas va esto". En mi caso me ha pasado muchísimas veces que tengo versiones de clases diferentes en cada PC y cada una de ellas con avances que la otra no tiene y que finalmente se pierden o me toca reprogramar.

No me había planteado el usar un sistema para gestionar mi código hasta que un día colson me comentó que él usaba subversion para mantener el código de su juego (the cursed wheel). Las ventajas que ofrecía eran muchísimas:

- unicidad de código: Solo hay una versión del código y esa está en el reprositorio, con esto evitas problemas de diferentes versiones en diferentes lugares, incluso dentro de la misma máquina. Por ejemplo, imaginemos que tenemos una librería para dibujar mallas que usamos en varios proyectos, sin usar un sistema gestor de código los cambios que hagamos, por ejemplo, en las cabeceras tendremos que copiarlo al resto de versiones. Personalmente me gusta tener una copia de cada clase dentro de la carpeta de proyecto y con subversion soluciono el problema de forma muy simple.

- salvavidas (I) : Estás tranquilamente programando una aplicación, haces unos cambios, compilas y pruebas con tan mala suerte que aparece un bug que antes no había. No problem, con subversion puedes ver los cambios de cada uno de los ficheros, comparas la versión actual con la última y así sabrás donde has podido meter la gamba. Este use es _extremandamente_ útil.

- salvavidas (y II): Estás tranquilamente programando con win2000 y vc++6.0 y se va la luz de tu casa. Te acuerdas de la madre de iberdrola y a continuación reinicias. Vuelves a arrancar vc++6.0 y te encuentras con que algunos .cpp están corruptos... GRRR... eso era antes, ahora rescatas última versión de ls archivos corruptos y a correr. Lo que sería ya rozar la perfección es tener el servidor en una máquina diferente por si las moscas, pero en caso contrario hacer backups es una tarea muy simple y que puede salvar muchas vidas. Luego pondré un pequeño script.

- más que código: subversion permite mantener versiones de cualquier fichero, ya sea texto o binario con lo cual todos los datos que maneje el programa podrán estar bajo un control de versión. En mi caso tengo bajo control los ficheros de proyecto de VC++, los ficheros de blender que uso para alguna que otra cosa, el propio código, la memoria del proyecto, etc.

- orden: aunque seas muy metódico a la hora de llevar un orden es muy posible que algo se descoloque o no vaya como debe, subversión te obliga, mejor dicho, te encauza para que tengas todo ordenao y perfectamente disponible sin realmente demasiado esfuerzo.

Dicho esto, procedo a dar los pasos para instalar y configurar un repositorio:

- bajarse subversion e instalarlo
- bajarse tortoiseSVN e instalarlo
- crear un directorio para el repositorio, p.ej c:\repos
- arrancar el server de subversion: svnserve -d -r c:\repos (aconsejable arrancarlo al inicio o tener un .bat)
- dentro de c:\repos crear una carpeta para cada código, p.ej c:\repos\proyecto1- pinchar en el segundo boton en esa carpeta: TortoiseSVN->create repository here (con esto le dices que ahí habrá un repositorio)
- importar los datos que contendrá ese repositorio, código, binarios, etc: Ir a la carpeta de proyecto1 originaria (donde tienes el código) y con el segundo botón TortoiseSVN->import... en la siguiente pantalla indicar la ruta del repositorio svn://localhost/proyecto1. Se importa todo y.... zasca, habrá problemas con el usuario. Ningún problema, dentro de c:\repos\proyecto1\conf hay dos archivos. Con passwd añades los siguiente:
"""
[users]
javi = mipass
"""
y en svnserve.conf pones:
"""
[general]
password-db = passwd
auth-access = write
"""

Ahora ya se puede entrar con el usuario y password que se han especificado en el fichero passwd.

- Ahora ya se puede "bajar" ese código a cualquier carpeta: p.ej en c:\proyectos_nuevos\proy1 pinchando en el segundo botón en SVNcheckout podrás bajar todo el código de cualquier repositorio.
- Cuando se modifique el código y quieres subir los cambios basta con pinchas en el segundo botón sobre c:\proyectos_nuevos\proy1 y pinchas en SVN commit.


Puede parecer un engorro al comienzo, pero es muy cómodo, útil y que sirve para cualquier cosa, por ejemplo para todos los ficheros se suelen tener de clase que siempre terminan perdidos, para la memoria del PFC, para el código de tus scripts de administración, etc, etc.

Por último un .bat que uso para hacer backups de todo mi proyecto fin de carrera que puede servir como ejemplo:

"""
svnadmin dump c:\repos\pfc_memoria --incremental > bak/pfc_memoria_bak
svnadmin dump c:\repos\pfc_main --incremental > bak/pfc_main_bak
svnadmin dump c:\repos\pfc_tools --incremental > bak/pfc_tools_bak
"""

11 comentarios:

Anónimo dijo...

Para las prácticas de informática de este año he acabado usando subversion en un server privado (para que no me las copien), hay un módulo de apache que hace todas esas cosas de usuario y demás, proporcionando una interfaz web para ver el código aunque si se tira de websvn se pueden hacer diff o bajar tarball directamente....

Es la forma más rápida y sencilla de trabajar en algo en varios equipos, y cuando te marchas "svn commit" Se pude aprovechar aún más si se usan tags y trunks pero a tanto no hemos llegado.

Nacho L dijo...

Yo acabo de empezar a utilizar SVN para el proyecto (somos 2 programadores) y estoy bastante contento. Yo me curré un post en el foro de la uni (no es de acceso libre :() que anarrosearé la proxima vez que alguien pregunte en Stratos por SVN.

El mio lo acabo de actualizar esta mañana mismo,ya que tuve que utilizar SVN como modulo de Apache (porque en la UPF hay un proxy y no te deja acceder al puerto de SVN).

Javi Santana dijo...

fanatiko: Ni que decir tiene que si para un programador es muy bueno, para varios es imprescindible.

mario: Lo que mola de SVN es que además tiene un montón de módulos hechos en python para CGI y scrips propios de SVN. Es algo que no tengo muy mirado, pero seguro que se le puede sacar muchísimo partido.

Anónimo dijo...

Hagg... mal comienzo... al correr el SVNSERVE se queda clavao...

Javi Santana dijo...

josepzin: el svnserve se queda clavado, ejecutalo y manten la ventana de comandos abierta. CUando lo ejecutas tampoco dice nada, símplemente se queda esperando.

Nacho L dijo...

Yo para hacer Backup uso 2 scripts (con una Dummy Task del Cobian):

primero hago un "RD /S /Q E:/Backup/SVN_Repo" y luego un "svnadmin hotcopy C:/SVN_Repo E:/Backup/SVN_Repo --clean-logs" ... supongo que tu forma sera igual de buena ;)

Recomiendo utilizar el wrapper SVNService y instalar Subversion como servicio del sistema, yo lo veo mas comodo almenos.

Por curiosidad javi, ¿porque optaste por SVN? Yo, la verdad, lo escogí un poco a ciegas y basandome en intuiciones, pero ha resultado ser la mejor opción.

Javi Santana dijo...

Opté por SVN por la misma razón que tú, un poco a ciegas fiándome de lo que se comentaba por ahí.

La verdad es que la forma de hacer bakup lo pillé de la documentación de subversion tal cual, así que no se demasiado del tema. De todas formas miraré a ver que diferencia una forma de otra.

En cuanto a lo de ponerlo como servicio prefiero no hacerlo ya que es algo que estará corriendo todo el tiempo cuando lo uso en ocasiones muy concretas. Para esas ocasiones lo arranco y ya.

gracias por el comentario.

Jove Chiere dijo...

Pues si que es interesante esto del SVN. Yo ya tengo servicio desde hace mas de 1 año y lo encontre buscando alternativas de CVS que era imposible para mi activarlo. Algunos "post" sugiriendolo hace tiempo escribi en stratos.

Aunque mi caso es extraño al ser yo un grafista...

Mi necesidad se creo a partir de que mis coders no me pasaban nunca una version actual del codigo y era un desespero el trabajar en esas condiciones... Asi los tengo mas controlados y se en que van trabajando.

Lo que si confieso que yo aplico un mal uso, ya que subo muchas cantidades de modelos y texturas que no deveria usarse para eso un SVN... Pero como dice el dicho "El gato es mio y me lo f....".

Gracias por el SVNservice Fanatiko.

Anónimo dijo...

ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - ARTUROGOGA ES UN COPY&PASTER! - v

Unknown dijo...

Mi script para backup de svn

#!/bin/bash

##############################################################################
## Problema:
## El comando svn_dump suelta un fichero al cual no podemos especificarle
## el nombre. Al no poder identificar cada fichero por no saber el nombre
## se va llenando el disco duro y no es fiable dejar el servidor sin mirarlo
## durante mucho tiempo.
##
## Solucion:
## Nada mas crear el fichero lo renombramos y asi podemos controlar el nombre
## nosotros.
##
## TODO:
## Comprobar si existen las carpetas origen y destino
##############################################################################

##VARIABLES
RUTA_SVN="/var/work-svn" #Directorio donde reside la raiz del svn
RUTA_BACKUP="/root/bsvn-work" #Directorio donde soltar los backups
FILE_HEAD="work-svn" #Inicio del nombre de fichero de volcado

#Primero Ejecutamos el comando para crear el backup
svn-backup-dumps -b -O $RUTA_SVN $RUTA_BACKUP/

#Ahora como sabemos que el fichero se llama svn.*.bz2 ...
##Si existe el de 2 dias ( el mas antiguo ) lo borramos
if [ -f $RUTA_BACKUP/svn_backup_twodays.bz2 ]; then
rm $RUTA_BACKUP/svn_backup_twodays.bz2
fi

##Si existe el de 1 dia lo renombramos como el mas antiguo
if [ -f $RUTA_BACKUP/svn_backup_oneday.bz2 ]; then
mv $RUTA_BACKUP/svn_backup_oneday.bz2 $RUTA_BACKUP/svn_backup_twodays.bz2
fi

##Ahora el Backup que habia lo renombramos a 1 dia de antiguedad
if [ -f $RUTA_BACKUP/svn_backup_today.bz2 ]; then
mv $RUTA_BACKUP/svn_backup_today.bz2 $RUTA_BACKUP/svn_backup_oneday.bz2
fi

##Finalmente creamos el backup y lo renombramos a today como el mas nuevo
mv $RUTA_BACKUP/$FILE_HEAD.*.bz2 $RUTA_BACKUP/svn_backup_today.bz2

Anónimo dijo...

Soy tu alumno más pesao de la Ponti. Ya me lo he dejado montado, ahora a ver como soluciono el problema del ventanuco feo, la integración con Eclipse y el acceso remoto. Ya he preguntado asi que es cuestión de tiempo.

¡Hala, un saludete!