Noticias javaHispano.org

martes, 21 de octubre de 2008

10 trucos de Subversion para controlar tu código


1. Usa status para encontrar tu...estado


Con Subversion, si quieres encontrar lo que has modificado ejecutas svn status. Este comando compara los ficheros en tu copia de trabajo (working copy) con aquellos en las areas administradas por Subversion (esos molestos directorios .svn), evitando así la necesidad de un acceso a la red de ida y vuelta:



$ svn status
D fish.c
A shrimp.c
M anemone.c


Ten en cuenta que fish.c está previsto que sea borrado, shrimp.c está previsto que sea añadido, y anemone.c ha sido modificado.


Ahora, por defecto, svn status sólo muestra los ficheros que son interesantes (como aquellos que han sido añadidos, modificados o borrados). Si quieres ver la información de todos los ficheros de tu copia de trabajo, utiliza la opción --verbose


  $ svn status --verbose

44 23 sally README

44 30 sally INSTALL

44 35 harry trout.c

D 44 19 ira fish.c

A 0 ? ? shrimp.c

M 0 ? ? anemone.c

44 36 harry things/rocks.txt


La primera columna representa lo mismo, pero la segunda muestra la revisión de trabajo del elemento. Las tercera y cuarta columnas muestran la revisión del último cambio del elemento y quién la realizó.


Si quieres saber qué ficheros se actualizarán la próxima vez que ejecutes svn update, utiliza la opción --show-updates en el comando svn status


  $ svn status --show-updates --verbose
* 44 23 sally README
44 30 sally INSTALL
* 44 35 harry trout.c
D 44 19 ira fish.c
A 0 ? ? shrimp.c
M * 44 32 sally anemone.c
44 36 harry things/rocks.txt

Puedes ver que los ficheros que serán actualizados son los marcados con un *.


2. Recuerda, puedes mover cosas


He visto personas pasando mucho tiempo en reuniones decidiendo la estructura de directorios y el lugar de los ficheros en un proyecto, pero con Subversion puedes mover ficheros y directorios con total libertad:


  $ svn move foo.c bar.c

A bar.c

D foo.c

Ahora bar.c ha sido marcado para ser añadido y foo.c ha sido marcado para ser borrado. (Así es como Subversion representa un movimiento de ficheros. svn commit Enviará tus cambios al servidor.)

Puedes mover ficheros y directorios directamente en el servidor mediante las URL's:


  $ svn move -m "Move a file" http://svn.red-bean.com/repos/foo.c \
http://svn.red-bean.com/repos/bar.c



Esto realiza el movimiento de foo.c a bar.c en el servidor directamente.


3. Etiquetar y crear ramas mediante copia


En Subversion, las operaciones de rama (branch) y etiquetado (tag) se hacen como copias:


  $ svn copy -m "Tag rc1 rel." http://svn.red-bean.com/repos/trunk \
http://svn.red-bean.com/repos/tags/1.0rc1



Has creado una etiqueta de tu línea principal de desarrollo o troncal (indicada como trunk en términos de Subversion). Si en realidad quieres crear una rama, copia la linea troncal de desarrollo en el directorio branches (ramas), es así de sencillo. Y en Subversion, etiquetar y crear ramas es así de rápido.


En Subversion, etiquetas y ramas son sólo rutas copiadas en el árbol del repositorio. Por convención, las etiquetas se encuentran bajo la ruta /tags y las ramas bajo /branches.


Subversion necesita solo copiar un unico nodo directorio para hacer una copia, lo cual no es realmente rápido, pero ocupa muy poco espacio en el repositorio--no importa el número de ficheros incluidos en la rama o etiqueta. ¡La comunidad de Subversion los llama "cheap copies" ("copia barata") por una buena razón!


No estás limitado a etiquetar todos los ficheros en la misma revision en Subversion: Si necesitas hacer una etiqueta o rama "revision-mezclada", siempre puedes copiar una copia de trabajo en una URL:



$ svn copy -m "Mixed branch." . http://svn.red-bean.com/repos/branch/1.2-mixed

Vete a Branching and Merging para una descripción más extensa de cómo hacer ramas y etiquetar.



4. "Revert" en vez de "delete and update"



Subversion almacena una copia original de cada fichero en el directorio .svn de tu copia de trabajo, de manera que puedes hacer esto:


  $ svn revert I-made-a-boo-boo.txt
Reverted 'I-made-a-boo-boo.txt'


Esto viene bien si no tienes una conexión de red en un momento dado.



5. No temas a tu sistema de control de versiones



Por defecto, ciertos sistemas de control de versiones que no mencionaré (como CVS) traducen los finales de línea (de CR [Unix] a CRLF [Windows] y viceversa) y expanden palabras reservadas (como $Id$) en tus ficheros. Esto es muy útil hasta que subes al repositorio un fichero binario y CVS, en un alarde de generosidad, convierte tu fichero en algo incomprensible.


Subversion nunca hará nada sobre tus datos salvo que tú se lo pidas explícitamente.

Repitamos de nuevo:



SUBVERSION NUNCA HARÁ NADA SOBRE TUS DATOS A MENOS QUE SE LO PIDAS.

Puedes añadir cualquier fichero binario a tu repositorio de Subversion y no tener que hacer nada especial para que Subversion no destruya tu fichero. Sin embrago, si añades un fichero de texto (un fichero .java o .c, por ejemplo), podrías querer que Subversion controle la transformación del fin de linea automáticamente por ti. Esto se hace usando las propiedades de Subversion.



En este caso, tendrás que asignar a la propiedad svn:eol-style el valor native:



  $ svn propset svn:eol-style native halibut.c


y subir tu cambio al repositorio.



Puedes aprender de tu cliente de Subversion para añadir ciertas propiedades a tus ficheros automáticamente--lee la sección de Automatic Properties y su configuración para más información.




6. Log, log, log tu log



El comando log de Subversion proporciona datos útiles y compactos basado en un commit atómico de Subversion. Por ejemplo:


$ svn log
------------------------------------------------------------------------
r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line

Outline sandwich fixins.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line

Initial import
------------------------------------------------------------------------


Cada entrada del log muestra el número de revisión de la entrada, el autor, la fecha, el número de líneas en la entrada de log (para ayudar en el análisis de la salida de svn log), y el mensaje de log en sí mismo. Si quieres ver las rutas que cambiaron en la salida de tu log, pasa la opción --verbose:

$ svn log --verbose ------------------------------------------------------------------------ r3 | sally | Mon, 15 Jul 2002 18:03:46 -0500 | 1 line Changed paths: M /trunk/sandwich.txt

Added include lines and corrected # of cheese slices.
------------------------------------------------------------------------
r2 | harry | Mon, 15 Jul 2002 17:47:57 -0500 | 1 line
Changed paths:
M /trunk/sandwich.txt

Outline sandwich fixins.
------------------------------------------------------------------------
r1 | sally | Mon, 15 Jul 2002 17:40:08 -0500 | 1 line
Changed paths:
A /trunk/sandwich.txt

Initial import
--------------------------------------------------------------------



En los ejemplos anteriores, habrás notado que no hemos pasado ningún fichero o directorio específico (llamados targets) al comando de log. Si ejecutas svn log sin especificar targets (objetivos), Subversion presupone que te refieres al directorio de trabajo actual. Subversion usa una revision de incio de 1, y la revision de trabajo de tu directorio de trabajo actual como la revision final. (Puedes saber cuál es esta revision de trabajo usando svn status -v, como mencionamos anteriormente.)



Y ahora una pequeña nota: Si subes un cambio de un fichero e inmediatamente ejecutas svn log, no verás el mensaje de log de tu commit reciente. Esto es debido a que la "revision de trabajo" de tu directorio de trabajo no ha sido actualizado (subir un fichero no actualiza inmediatamente tu directorio de trabajo o cualquier otro fichero). Si ejecutas svn update y a continuación svn log, verás el mensaje de log "perdido".



Lee http://svnbook.red-bean.com/en/1.5/svn.tour.history.html y http://svnbook.red-bean.com/en/1.5/svn.ref.svn.c.log.html para más información sobre el uso de svn log.




7. Deshacer rápidamente un commit erróneo



Supón que tienes una copia de trabajo de /trunk y descubres que el cambio que hiciste en la revisión 303, que modificó oyster.c, es erróneo por completo--nunca debería haberse subido al repositorio. Puedes usar svn merge para "deshacer" el cambio en tu copia de trabajo*, y entonces subir la modificación local al repositorio. Todo lo que necesitas hacer es especificar una diferencia inversa usando svn merge:


  $ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
U oyster.c

Usa svn diff para verificar que el cambio es correcto, y entonces súbelo al repositorio.



Para más información, lee Undoing Changes


* Es decir, restaura la última versión de tu repositorio a su estado anterior; Subversion todavía tendrá el commit "malo" en el repositorio. Siendo un sistema de control de versiones, el trabajo de Subversion es recordar todo lo que le hayas enviado.




8. Recuperar elementos eliminados



Si borras un fichero de tu repositorio y quieres "resucitarlo" a la última versión del respositorio, la forma más fácil es con svn copy desde una revisión anterior a su eliminación a tu copia de trabajo. Usa svn log -v para encontrar la revisión donde fue borrado, y entonces haz tu copia:


 $ svn copy --revision 807 \
http://svn.red-bean.com/repos/trunk/perch.c ./perch.c

Para más detalles, mira Resurrecting deleted items.




9. Cambia a una rama sin crear una nueva copia de trabajo



Como Subversion trata las etiquetas y las ramas como rutas normales en el repositorio, puedes ejecutar svn update para actualizar tu copia de trabajo al nombre de la rama con la que quieres comenzar a trabajar. Introduce el comando svn switch.


svn switch actualiza tu copia de trabajo para apuntar a un nuevo árbol en el repositorio--es decir, el árbol de una rama en vez del árbol troncal.


Esta es la manera que Subversion tiene para mover una copia de trabajo a una nueva rama.


  $ svn switch http://svn.red-bean.com/repos/branches/vendors-with-fix .
U myproj/foo.txt
U myproj/bar.txt
U myproj/baz.c
U myproj/qux.c
Updated to revision 31.

Para más detalles, ver Traversing branches.



10. Visualizar o montar tu repositorio



Si tu repositorio Subversion está instalado a través del servidor Apache HTTP Server (es decir, accedes a él mediante una URL que comienza con http), Subversion te da un par de regalos muy sabrosos:



Primero, puedes acceder desde cualquier navegador web al repositorio de Subversion y navegar como quieras através de la última revisión del repositorio.



tips1-top10-browse.jpg



Segundo, si usas un sistema operativo que conozca el protocolo DAV, puedes montar tu repositorio de Subversion en tu escritorio (sólo lectura):



tips2.jpg



tips3-top10-mount.jpg



Además de ser conveniente para ver el contenido de tu repositorio, es útil para compartir ficheros con usuarios distintos a Subversion.

3 comentarios:

ivancace dijo...

Pedazo articulo no? Que sepas que me lo he leído entero. Se ve que te enseñe bien a utilizar el subversion.

Jorge Jiménez dijo...

Pues tienes razón en lo de enseñarme...pero es solo una traducción para los que no les gusta leer artículos técnicos en inglés.
Se me olvidó indicar la referencia del artículo para quien quisiera leer el original

ivancace dijo...

De todas formas, yo seguire utilizando algun plugin.

P.D. Ya que estas con artículos técnicos, podías poner uno bueno de maven 2...