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

c00¡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:

  • –username admin
    • Parámetro que sirve para establecer un nombre de usuario de inicio de sesión del control de versiones. A veces no es necesario éste parámetro. Si se trata de un Subversion Edge, el usuario por defecto es admin
  • URL del proyecto dentro de un repositorio (http://miserver.org:18080…)
    • Puede variar entre los servidores Subversion y los protocolos que se usan. Básicamente es la URL del proyecto específico que está dentro de un repositorio.
  • miproyecto
    • Es el nombre de la carpeta local a la cual quiero que se ponga la copia de trabajo.

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:

c01

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:

  • ‘ ‘ (vacío)
    • No hay modificaciones
  • ‘A’
    • Agregado o nuevo archivo por así decirlo
  • ‘C’
    • Presenta conflicto (lo veremos en otra entrada…)
  • ‘D’
    • Eliminado (marcado para ser eliminado)
  • ‘I’
    • Ignorado
  • ‘M’
    • Modificado (marcado para ser actualizado)
  • ‘R’
    • Reemplazado
  • ‘?’
    • El ítem no está bajo control de versiones. Generalmente a estos les tenemos que poner ojo, dado que probablemente debamos de marcarlos para ser agregados (A).
  • ‘!’
    • Ítem faltante (removido por un comando ajeno a svn) o incompleto. También tenemos que ponerle atención, dado que es probable que necesitemos marcarlo para eliminar (D) o es que realmente se eliminó por equivocación y tendríamos que volverlo a traer del repositorio.

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:

c021

Vamos a explicar cada uno:

  • archivo1.txt
    • Se subió anteriormente (en una versión anterior) pero se acaba de modificar. Esta marcado para actualizarse entonces.
  • archivo2.txt
    • Éste archivo estaba en la versión anterior, pero se acaba de eliminar. Tenemos que decidir qué hacer con él…
  • archivo3.txt
    • Se ha creado éste archivo pero no se ha marcado para agregar al proyecto.
  • archivo4.txt
    • Se subió anteriormente (en una versión anterior) pero se acaba de eliminar y esta marcado para ser quitado del control de versiones.
  • archivo5.txt
    • Se ha creado éste archivo y esta marcado para ser agregado al proyecto.

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…

c03

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

c04


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

c05


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:

c06


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:

c07

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.

c08

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.

c13


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:

c101

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:

c11

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

c12


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

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*