IngDiaz

Uso básico de SVN (Subversion) por línea de comando – Control de versiones

¡Hola a todos!

En una entrada anterior toqué el tema de la posibilidad de usar un control de versiones de código fuente en Visual Studio .NET – PHP o del lenguaje que se quiera con Subversion, y en otra entrada mostré los pasos a seguir para instalar una solución de control de versiones (Subversion Edge) en Ubuntu. En ésta oportunidad, les traigo la forma de cómo utilizar éste control de versiones (siempre con Subversion) mediante línea de comando en GNU/Linux, específicamente en Ubuntu.

No mencionaré mucho sobre la teoría de qué es un control de versiones, qué es Subversion, etc. porque lo mencioné en las entradas mencionadas… por tanto me dedicaré a ver el uso básico de SVN en Ubuntu, empezando por su instalación.

Lo podemos instalar así:

sudo apt install subversion

Una vez instalado, podemos iniciar a ver un poco las funciones básicas que se tienen que saber. Realmente el control de versiones se puede aplicar a cualquier cosa que requiera controlar los cambios realizados… en ése sentido, podríamos tener archivos de textos, imágenes, música,… cualquier cosa, y a esto aplicarle el control de versiones; pero para efectos de éste tutorial, nos enfocaremos en los proyectos de desarrollo de software.

Para el siguiente tutorial, crearé una carpeta llamada svn dentro del home del usuario, y desde aquí trabajaremos.

mkdir ~/svn
cd ~/svn

Obtener una copia de un proyecto que está en un repositorio

Ya sea en LAN (en un servidor Subversion) o en Internet, los proyectos manejados por medio de controles de versiones se almacenan en repositorios, por cuanto para tener una copia local de dicho proyecto, debemos de crear una carpeta donde queramos almacenarlo y luego ejecutar la siguiente línea de comandos:

mkdir miproyecto
svn checkout --username admin http://miserver.org:18080/svn/proyecto miproyecto

Donde:

Ahora ya podemos entrar a la carpeta miproyecto y ver el código fuente del proyecto.

En el siguiente ejemplo, he creado un repositorio local en mi mismo equipo (cliente) para hacer éste tutorial… por tal razón, el checkout que hice es un poco diferente dado que hago referencia a una carpeta local en mi sistema de archivo, pero la lógica es la misma:

Por tanto, mi repositorio principal es «proyecto» y mi copia local es «miproyecto«. Como podemos ver, el repositorio es nuevo dado que el número de revisión obtenida es 0 (cero). También, quería mostrarles la imagen anterior dado que, al hacer un ls dentro de «miproyecto» no hay archivos, pero si que hay una carpeta «oculta» que podemos verla con ls -a ; La carpeta .svn es sumamente importante y no se debe de eliminarse ni tocar prácticamente… dado que ésta es necesaria para el debido control de versiones.


Crear un nuevo repositorio (desde el servidor)

Si estamos en el servidor Subversion, podemos crear un repositorio fácilmente con el comando svnadmin. Éste proceso lo coloco solo para referencia personal, realmente del lado del cliente ésto no se debe de hacer.

svnadmin create /home/oscard/svn/proyecto

Estado de los archivos en un proyecto

Si hemos creado varios archivos dentro de la carpeta a la cual hicimos el checkout (comando de más arriba),  modificado o eliminado alguno que ya estuviera versionado, entonces tenemos que «marcar» dichos archivos nuevos y eliminados para que, al actualizar dicha información en el repositorio, todo quede como nosotros lo esperamos y se cree una nueva revisión. En ése caso, debemos de utilizar el comando svn status.

svn status

Nos aparecerá una lista de archivos con su respectivo estado comparando lo que tenemos en nuestra copia local con lo que esta en el repositorio. A continuación, les pongo un resumen de los estados más comunes de archivos:

Hay otros más, pero estos son los más comunes creo yo… para ver más en detalle, pueden ejecutar el comando svn help status

Ver el siguiente ejemplo:

Vamos a explicar cada uno:

Con base a ésta información, vamos a ver cómo agregar, actualizar o eliminar los cambios al control de versiones.


Subir los cambios

Para subir los cambios, se utiliza la siguiente línea de comando:

svn commit -m "Comentario sobre ésta revisión"

En éste caso, si no colocamos el parámetro -m , se abrirá el editor de texto que tengamos por defecto (en Ubuntu lo mejor es usar nano 🙂 ) y desde ahí podemos agregar el comentario respectivo. Inicia entonces la subida de la información al repositorio y se muestra el detalle de lo que se esta haciendo.

Siguiendo el ejemplo de arriba…

Se actualizó el archivo1.txt (M), se eliminó el archivo4.txt (D) y se añadió el archivo5.txt (A). Un dato importante, es el # de revisión (o versión)… en éste caso es el 6.


Agregar archivos

Para agregar o «marcar» archivos nuevos para que pueda ser subidos repositorio, hacemos:

svn add archivo3.txt


Eliminar archivos

Para eliminar o «marcar» archivos para eliminarse del repositorio (o que fueron eliminados de la copia local pero no del repositorio), hacemos:

svn delete archivo2.txt


Actualizar la copia local del proyecto

Recordemos que la gracia del control de versiones es para que varias personas puedan trabajar al mismo tiempo en un proyecto, es por ésta razón importante asegurarse que se tenga la última versión del proyecto. También, si eliminamos por accidente algún archivo, podemos traerlo del repositorio y así recuperarlo (sin perder las marcas que ya se tienen, por ejemplo los que se agregarán, eliminarán, o modificarán…). Para actualizar la copia local del proyecto ingresamos:

svn update

También podemos recuperar un archivo específico por eliminación accidental o algo parecido… especificando el nombre del archivo al final de la línea (Ej: svn update archivo1.txt)

A continuación, veremos un ejemplo:


Actualizar la copia local con una revisión específica

También podemos actualizar la copia local con una revisión específica, de ésta manera:

svn update -r 5

En éste caso, nos traerá lo que tenía la revisión 5.


Historial de cambios

Para ver el historial de cambios o revisiones (por eso es importante agregar comentarios cuando se hacen los commits), lo podemos hacer de la siguiente manera:

svn log

A continuación un ejemplo:

Si hay demasiadas revisiones, es probable que queramos hacer un filtro de ésta información, entonces podemos hacer lo siguiente:

svn log 5:7

Con esto, se verán las revisiones del 5 al 7.

Dicho sea de paso, mientras más información se agregan en los comentarios del Commit, es mejor… digamos, porqué razón se realizó el cambio, quién lo solicitó…, y cosas así… a la larga, ustedes mismos se agradecerán xD

Agrego también una línea de comando importante; para ver en detalle los archivos con su respectivo status del commit, podemos ingresar:

svn log -v -r 9

El secreto está en -v (o –verbose), con el cual se nos presentará la lista de archivos que se subieron.


Diferencias entre revisiones

Podemos ver la diferencia entre versiones de un archivo específico. En el caso que queramos ver la diferencia entre lo que se tiene en la copia local con la revisión anterior, directamente ingresamos:

svn diff archivo1.txt

Si hubieron cambios, nos presentará la información respectiva. A continuación, un ejemplo:

Podemos ver que hay diferencia entre la revisión 8 (la revisión anterior) y la copia de trabajo (lo que se ha estado modificando agregando o quitando líneas del archivo). Se puede identificar qué versión tiene las lineas suprimidas o modificadas con un signo al inicio de la línea y las lineas añadidas, las cuales empiezan con un signo +

También podemos hacer una comparación entre nuestra copia de trabajo con una revisión específica:

svn diff -r 2:8 archivo1.txt

Con la línea anterior, se nos mostrará los cambios que hay entre la revisión 2 y la revisión 8 en el archivo1.txt. A continuación, un ejemplo:

Hay otras maneras de poder comparar archivos entre versiones, pero para efectos de ésta entrada básica nos quedaremos hasta aquí.


Excluir archivos del control de versiones

Podemos excluir del control de versiones archivos específicos. Para gestionar la lista de archivos excluidos, hacemos:

svn propedit svn:ignore .

Se nos abrirá un editor de texto (el por defecto que tengamos), en el cual podemos agregar en cada línea la extensión o archivo específico a excluir. Por ejemplo:

*.log

En éste caso, se excluirán todos los archivos .log


Ok, por el momento es todo… En próxima entrada tocaré el tema del respaldo y restauración de repositorios.

¡Saludos!

Comentarios por Facebook

comentarios