¿Qué es SVN?
¿Has estado alguna vez en una situación donde tenías que trabajar en un archivo que alguien más estaba modificando al mismo tiempo? ¿Perdiste tus cambios producto de alguna falta de coordinación? ¿Has salvado alguna vez un archivo y después querido regresar a una versión anterior, deseando poder ver como lucía el archivo en un determinado lugar del tiempo? Para poder hacer esto no se necesita una máquina del tiempo. El Control de Versiones es el arte de manejar cambios de información que pueden ayudar a resolver casos como los anteriores.
TortoiseSVN es un cliente de código abierto para el sistema de control de versiones Subversion. TortoiseSVN administra los archivos y directorios a través del tiempo. Los archivos son guardados en un repositorio central, similar a cualquier repositorio ordinario de archivos, con la excepción de que recuerda cada cambio que se haya hecho sobre archivos y directorios. Esto permite recuperar versiones viejas de los archivos que trabajamos, y examinar el historial para obtener información como quién cambió los datos y cuándo lo hizo.
Conceptos básicos
Los sistemas de control de versiones son diseñados para guardar y dar un seguimiento de los cambios hechos a través del tiempo. Existen dos métodos más comunes de hacer versionamiento. Uno es el “Lock-Modify-Unlock” (Bloquear-Modificar-Desbloquear). Con este método los usuarios bloquean los archivos que van a editar para evitar que algún otro usuario los modifique. La desventaja de esta solución es que los usuarios pueden olvidar desbloquear archivos, o pueden innecesariamente bloquear archivos si los usuarios están trabajando en diferentes áreas de un archivo.
TortoiseSVN utiliza el método “Copy-Modify-Merge” (Copiar-Modificar-Unir) para crear copias de trabajo de los archivos para los usuarios. De esta manera los usuarios trabajan en paralelom, modificando sus propias copias privadas de los archivos. Finalmente, las copias privadas son fusionadas/unidas en una nueva versión final. Durante este proceso de unión de cambios puede pasar que hayan conflictos (estos serán vistos más adelante). TortoiseSVN también soporta la capacidad de bloquear archivos y carpetas si se requiere. Lo importante es que sin importar que tan bueno sea el sistema de control de versiones, la comunicación entre los miembros del equipo sigue siendo clave para mantener un buen flujo de trabajo.
Repositorios
Subversion es un sistema centralizado para compartir información. Su núcleo es un repositorio, el cual es un centro de almacenamiento de datos. El repositorio guarda información en la forma de un árbol de sistema de archivos - la típica jerarquía de archivos y directorios. Cualquier número de clientes se conectan al repositorio, y luego leen o escriben en esos archivos. Al escribir datos, un cliente hace la información disponible para otros; al leer datos, los clientes reciben información de otros.
Lo que hace el repositorio de Subversion especial es que recuerda cada cambio que se ha escrito en él: cada cambio a cada archivo, inclusive los cambios al directorio, como la adición, borrado y reacomodo de archivos y directorios. Uno puede observar la última versión del sistema de archivos, pero también se tiene la capacidad de ver estados previos del árbol de directorios. Por ejemplo, qué contenía un directorio en día particular, quién fue la última persona que cambió el archivo, y qué cambios les hizo.
Una manera de visualizar el repositorio es verlo como una serie de árboles. Imaginémosnos un arreglo de número de revisiones, comenzando en 0, yendo de izquierda a derecha. Cada número de revisión tiene un árbol de sistema de archivos colgando debajo de él, y cada uno de esos árboles es un foto instantánea de la manera en que el repositorio se veía después de cada "commit" (acción para guardar cambios locales al repositorio).
Copias de trabajo/locales
La copia local o de trabajo, es una área privada sobre la cual se hace toda la edición de los archivos en la estación de cada persona involucrada en el proyecto. Subversion nunca va a incorporar los cambios de otras personas, ni hacerlos disponibles a otros, al menos que explícitamente se le indique que lo haga.
Después de que se hacen cambios a los archivos en la copia local y se verifica que trabajan correctamente, Subversion provee comandos para "
publicar" los cambios (al escribirlos en el repositorio) para hacerlos disponibles a otras personas que están trabajando en el mismo proyecto. Si otros miembros del equipo publican sus propios cambios, Subversion pone a disposición comandos para hacer las uniones ("merges") de los archivos que han sido editados por más de una persona a la vez.
Las copias locales contienen unos archivos generados por Subversion (contenidos en las carpetas llamadas ".svn"), que son utilizados por el sistema para mantener los estados actuales de los archivos.
Estados
Cuatro posibles estados de las copias locales:
Sin alterar, y actual (Unchanged, and current) | El archivo está sin cambiar en el directorio de trabajo, y no cambios al archivo han sido enviados al repositorio desde la revisión de trabajo. Un commit al archivo no hará nada, y una actualización al archivo tampoco hará nada. |
Cambiado localmente, y actual (Locally changed, and current) | El archivo ha sido cambiado en el directorio de trabajo, y no cambios al archivo han sido enviados al repositorio desde la revisión base. Hay cambios locales a los cuales no se les ha hecho una acción de commit al repositorio, por lo cual un commit al archivo terminará publicando los cambios exitosamente, y una actualización al archivo no haría nada. |
Sin cambiar, y desactualizado (Unchanged, and out-of-date) | El archivo no ha sido cambiado en el directorio de trabajo, pero ha sido cambiado en el repositorio. El archivo debería ser eventualmente actualizado para tener la versión más reciente. Una acción de commit no haría nada, y una actualización del archivo traería a la copia local, los últimos cambios hechos en el repositorio. |
Cambiado localmente, y desactualizado (Locally changed, and out-of-date) | El archivo ha sido cambiado tanto en el directorio de trabajo, como en el repositorio. Una acción de commit al archivo terminaría con un error de desactualización ("out-of-date error"). El archivo debería ser actualizado primero; un comando decactualización intentará hacer una unión de los cambios públicos con los cambios locales ("merge"). Si Subversión no puede completar la unión de una manera plausible automáticamente, dejará al usuario que él mismo resuelva los conflictos. |
Menús Contextuales
TortoiseSVN proporciona acceso a los distintos comandos a traves de menús contextuales que se integran con el sistema de ficheros de Windows. Al dar clic derecho sobre un archivo o carpeta aparecen distintas opciones dependiendo de si el archivo o la carpeta está sincronizados con un repositorio.