¡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:
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:
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…
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!
Muy buen resumen, me fue útil. Gracias compañero.
De nada! Un gusto poder ayudar. Saludos!