Subversion generalmente trabaja mejor sin bloqueos, utilizando los métodos “Copiar-Modificar-Fusionar” que se describieron anteriormente en el “La solución copiar-modificar-fusionar”. Sin embargo, hay algunas pocas situaciones en las que puede querer implementar alguna forma de política de bloqueo.
Está utilizando archivos “no fusionables”, por ejemplo, archivos de imagen. Si dos personas cambian el mismo archivo, la fusión no es posible, así que alguno de ellos perderá sus cambios.
Su compañía ha utilizado en el pasado un sistema de control de versiones bloqueante, y la dirección ha decidido que “bloquear es lo mejor”.
Primero necesita asegurarse que su servidor de Subversion está actualizado al menos a la versión 1.2. Las versiones anteriores no tienen ningún soporte de bloqueos. Si está usando el acceso file://
, sólo necesitará actualizar sus clientes, por supuesto.
In this section, and almost everywhere in this book, the words “lock” and “locking” describe a mechanism for mutual exclusion between users to avoid clashing commits. Unfortunately, there are two other sorts of “lock” with which Subversion, and therefore this book, sometimes needs to be concerned.
The second is working copy locks
, used internally by Subversion to prevent clashes between multiple Subversion clients operating on the same working copy. Usually you get these locks whenever a command like update/commit/... is interrupted due to an error. These locks can be removed by running the cleanup command on the working copy, as described in “Limpieza”.
And third, files and folders can get locked if they're in use by another process, for example if you have a word document opened in Word, that file is locked and can not be accessed by TortoiseSVN.
You can generally forget about these other kinds of locks until something goes wrong that requires you to care about them. In this book, “lock” means the first sort unless the contrary is either clear from context or explicitly stated.
Por defecto, nada se bloquea y todo el mundo que tiene acceso de confirmación puede confirmar cambios a cualquier archivo en cualquier momento. Los demás actualizarán sus copias de trabajo periódicamente y los cambios en el repositorio se fusionarán con los cambios locales.
Si Obtiene un Bloqueo en un archivo, entonces sólo usted puede confirmar ese archivo. Las confirmaciones de los demás se bloquearán hasta que quite el bloqueo. Un archivo bloqueado no puede ser modificado de ninguna forma en el repositorio, por lo que no puede ser siquiera borrado o renombrado, excepto por el dueño del bloqueo.
Un bloqueo no se asigna a un usuario específico, sino a un usuario específico y a una copia de trabajo. Tener un bloqueo en una copia de trabajo también impide al mismo usuario hacer un commit del fichero bloqueado desde otra copia de trabajo.
Por poner un ejemplo, imagina que el usuario Jon tiene un copia de trabajo en el PC de su oficina. Allí empieza a trabajar en una imagen, y por lo tanto adquiere el bloqueo de ese fichero. Cuando deja su oficina aún no ha terminado con ese fichero, por lo que no libera dicho bloqueo. De vuelta a casa Jon también tiene una copia de trabajo y decide trabajar un poco más en el proyecto. Pero no puede modificar o hacer un commit de ese fichero de imagen, puesto que el bloqueo para el fichero se encuentra en la copia de trabajo de su oficina.
Sin embargo, los demás usuarios no necesariamente saben que usted ha obtenido un bloqueo. A menos que ellos comprueben el estado de bloqueo regularmente, la primera vez que sabrán sobre él es cuando sus confirmaciones fallen, lo que muchas veces no es muy útil. Para hacer más fácil el manejo de bloqueos, hay una nueva propiedad de Subversion svn:needs-lock
. Cuando se establece esta propiedad (a cualquier valor) en un archivo, siempre que el archivo se obtiene o actualiza, la copia local se deja como sólo-lectura a menos que la copia de trabajo tenga un bloqueo para ese archivo. Esto actúa como una advertencia indicando que no debería modificar el archivo a menos que obtenga un bloqueo. Los archivos que están versionados y marcados como sólo-lectura se marcan con un ícono superpuesto especial en TortoiseSVN para indicar que necesita obtener un bloqueo antes de editar.
Los bloqueos se graban con el lugar de la copia local y también con el propietario. Si tiene varias copias de trabajo (en casa, en el trabajo) entonces sólo puede obtener un bloqueo en una de esas copias de trabajo.
Si uno de sus compañeros de trabajo obtiene un bloqueo y luego se va de vacaciones sin quitarlo, ¿qué hace? Subversion proporciona un método para forcar bloqueos. Quitar un bloqueo que tiene otra persona se define como Romper el bloqueo, y obtener forzosamente un bloqueo que tiene otro se define como Robar el bloqueo. Naturlamente estas no son cosas que hacer a la ligera si desea continuar siendo amigo de sus compañeros de trabajo.
Los bloqueos se guardan en el repositorio, y se crea un token de bloqueo en su copia local de trabajo. Si hay una discrepancia, por ejemplo si alguien ha roto el bloqueo, el token local se convierte en inválido. El repositorio siempre es la referencia definitiva.
Seleccione el archivo o archivos en su copia de trabajo para los que desee obtener un bloqueo, y seleccione el comando
→ .
Aparece un diálogo, que le permite introducir un comentario, para que los demás vean por qué ha bloqueado el archivo. El comentario es opcional, y de momento sólo se utiliza con repositorios basados en Svnserve. Si (y sólo si) necesita robar el bloqueo de alguien, marque la casilla Robar bloqueo, y luego pulse .
Puede activar la propiedad tsvn:logtemplatelock
para proporcionar una plantilla de mensaje para que la rellenen los usuarios como el mensaje del bloqueo. Consulte “Configuración del proyecto” para las instrucciones sobre cómo activar las propiedades.
Si selecciona una carpeta y luego utiliza todos los archivos en todas las subcarpetas seleccionados para bloquearlos. Si realmente quiere bloquear una jerarquía completa, ésta es la forma de conseguirlo, pero puede ganarse la antipatía de sus compañeros de trabajo si les bloquea todo el proyecto. Utilícelo con cuidado...
→ se abrirá el diálogo de bloquear conPara asegurarse que no se olvida de quitar un bloqueo que no necesita más, los archivos bloqueados se muestran en el diálogo de confirmar y se seleccionan por defecto. Si continúa con la confirmación, los bloqueos que tenga sobre los archivos seleccionados se quitan, incluso si los archivos no se han modificado. Si no desea quitar el bloqueo en algunos archivos, puede desmarcarlos (si no están modificados). Si desea mantener los bloqueos en un archivo que ha modificado, tiene que habilitar la casilla Mantener bloqueos antes de confirmar sus cambios.
Para quitar un bloqueo manualmente, seleccione el archivo o archivos de su copia de trabajo para los que desee quitar el bloqueo, y luego seleccione el comando
→ . No hay nada más que introducir por lo que TortoiseSVN contactará con el repositorio y quita los bloqueos. También puede utilizar este comando en una carpeta para quitar todos los bloqueos recursivamente.
Para ver qué bloqueos tiene usted y los de los demás, puede utilizar el comando → . Los tokens de bloqueos que se tienen localmente se muestran inmediatamente. Para comprobar los bloqueos que tienen los demás (y para ver si alguno de sus bloqueos se han roto o han sido robados) necesita pulsar .
Desde el menú contextual aquí, también puede obtener y quitar bloqueos, además de romper y robar bloqueos que tienen otros.
Si ha roto o robado el bloqueo de otro sin decírselo, puede causar una pérdida potencial de trabajo. Si está trabajando con tipos de archivos no fusionables y roba el bloqueo de otro, una vez que usted quite el bloqueo ellos son libres de confirmar sus cambios y sobreescribir los suyos. Subversion no pierde datos, pero ha perdido la protección para trabajo en equipo que el bloqueo le proporcionaba.
Como se menciona arriba, la manera más efectiva de utilizar los bloqueos es establecer la propiedad svn:needs-lock
en los archivos. Consulte “Configuración del proyecto” para obtener instrucciones sobre cómo establecer propiedades. Los archivos con esta propiedad establecida siempre se obtendrán y actualizarán con la marca de sólo-lectura a menos que su copia de trabajo tenga un bloqueo.
Como recordatorio, TortoiseSVN utiliza un ícono de superpuesto especial para indicarlo.
Si opera una política donde todos los archivos han de ser bloqueados, puede que encuentre más fácil utilizar la característica de Subversion auto-props para establecer la propiedad automáticamente cada vez que añada nuevos archivos. Para más información, lea “Establecer propiedades automáticamente”.
Cuando crea un nuevo respositorio con Subversion 1.2 o superior, se crean cuatro plantillas en el directorio hooks
del repositorio. Éstos se llaman antes y después de obtener un bloqueo, y antes y después de quitar un bloqueo.
Es una buena idea instalar un script gancho post-lock
y post-unlock
en el servidor que envíe un email indicando el archivo que se ha bloqueado. Poniendo este script en su sitio, todos sus usuarios serán informados si alguien bloquea/quita el bloqueo de un archivo. Puede encontrar un script gancho de ejemplo hooks/post-lock.tmpl
en su carpeta del repositorio.
También puede utilizar ganchos para no permitir romper o robar bloqueos, o quizás para limitarlo a un administrador designado para ello. O quizás desea enviar un email al propietario cuando uno de sus bloqueos se haya roto o robado.
Para más información, lea la “Scripts gancho en el lado del servidor”.