Subversion fonctionne généralement mieux sans verrouillage, en utilisant les méthodes « Copier-Modifier-Fusionner » décrites précédemment dans la section intitulée « La solution Copier-Modifier-Fusionner ». Cependant il y a quelques cas où vous pouvez devoir appliquer une certaine forme de politique de verrouillage.
Vous utilisez des fichiers « non fusionnables », par exemple, des fichiers graphiques. Si deux personnes changent le même fichier, la fusion n'est pas possible, donc l'une d'entre elles perdra ses modifications.
Votre société a toujours utilisé un système de contrôle de version avec des verrous par le passé et le management a décidé que « le verrouillage est la meilleure solution ».
Premièrement, vous devez vous assurer que votre serveur Subversion est mis à jour au moins à la version 1.2. Les versions antérieures ne supportent pas du tout le verrouillage. Si vous utilisez un accès de type file://
, alors bien sûr seul votre client doit être mis à jour.
Dans cette section, et presque partout dans ce livre, les mots « verrou » et « verrouillage » décrivent un mécanisme d'exclusion mutuelle entre utilisateur afin d'éviter des collisions de livraison. Malheureusement, il y a deux autres types de « verrou » auxquels Subversion, et donc ce livre, doivent parfois s'intéresser.
Le deuxième type est les verrous de copie de travail
, utilisés en interne par Subversion pour empêcher les collisions entre plusieurs clients Subversion opérant sur la même copie de travail. Ces verrous apparaissent généralement quand une commande de mise à jour, de livraison, etc., est interrompue à la suite d'une erreur. Ces verrous peuvent être retirés en lançant la commande Nettoyer sur la copie de travail, comme décrit dans la section intitulée « Nettoyer ».
Et troisièmement, les fichiers et les dossiers peuvent être verrouillés s'ils sont en cours d'utilisation par un autre processus. Par exemple, si vous avez un document word ouvert dans Word, ce fichier est verrouillé et TortoiseSVN ne peut pas y accéder.
Vous pouvez généralement oublier ces autres types de verrou jusqu'à ce que quelque chose se passe mal et vous oblige à vous y intéresser. Dans ce livre, « verrou » signifie le premier type, à moins que le contraire ne soit clair d'après le contexte ou précisé explicitement.
Par défaut, rien n'est verrouillé et quiconque a un accès en livraison peut livrer des modifications de n'importe quel fichier à tout moment. Les autres mettront à jour leurs copies de travail périodiquement et les modifications du dépôt seront fusionnées avec les modifications locales.
Si vous obtenez un verrou sur un fichier, alors vous seul pouvez livrer ce fichier. Les livraisons des autres utilisateurs seront bloquées jusqu'à ce que vous retiriez le verrou. Un fichier verrouillé ne peut être modifié d'aucune façon dans le dépôt, il ne peut donc pas non plus être supprimé ou renommé, sauf par le propriétaire du verrou.
Un verrou n'est pas assigné à un utilisateur spécifique, mais à un utilisateur spécifique et une copie de travail. Avoir un verrou sur une copie de travail empêche également le même utilisateur d'effectuer des livraisons des fichiers verrouillés depuis d'autres copies de travail.
Par exemple, imaginez que l'utilisateur Jon a une copie de travail sur le PC de son bureau. Il commence à travailler sur une image, et acquiert donc un verrou sur ce fichier. Quand il quitte le bureau, il n'en a pas encore terminé avec ce fichier, donc il ne libère pas ce verrou. De retour chez lui, Jon a aussi une copie de travail et décide de continuer à travailler un peu sur le projet. Mais il ne peut pas modifier ou livrer ce même fichier image, parce que le verrou sur ce fichier réside sur sa copie de travail au bureau.
Toutefois, les autres utilisateurs ne sauront pas nécessairement que vous avez posé un verrou. À moins qu'ils ne vérifient le verrouillage régulièrement, ils ne le découvriront que lorsque leur livraison échouera, ce qui n'est pas très utile dans la plupart des cas. Pour rendre la gestion des verrous plus facile, il existe une nouvelle propriété Subversion svn:needs-lock
. Quand cette propriété est définie (avec n'importe quelle valeur) sur un fichier, chaque fois que le fichier est extrait ou mis à jour, la copie locale est mise en lecture seule à moins que cette copie de travail ne détienne un verrou pour le fichier. Cela agit comme un avertissement de ne pas éditer ce fichier à moins que vous n'ayez d'abord posé un verrou. Les fichiers qui sont versionnés et en lecture seule sont identifiés par une coloration spéciale dans TortoiseSVN, pour indiquer que vous devez poser un verrou avant l'édition.
Les verrous sont enregistrés par emplacement de copie de travail et par propriétaire. Si vous avez plusieurs copies de travail (à la maison, au travail) alors vous ne pouvez détenir un verrou que dans une de ces copies de travail.
Si l'un de vos collègues pose un verrou et part ensuite en vacances sans le retirer, que faites-vous ? Subversion fournit un moyen de forcer les verrous. Retirer un verrou détenu par quelqu'un d'autre s'appelle casser le verrou et prendre de force un verrou déjà détenu par quelqu'un d'autre s'appelle voler le verrou. Naturellement, ce ne sont pas des choses que vous devriez faire à la légère, si vous voulez rester en bons termes avec vos collègues.
Les verrous sont enregistrés dans le dépôt et un jeton de verrouillage est créé dans votre copie de travail locale. S'il y a une incohérence, par exemple si quelqu'un d'autre a cassé le verrou, le jeton de verrouillage local devient invalide. Le dépôt est toujours la référence absolue.
Sélectionnez les fichiers de votre copie de travail pour lesquels vous voulez un verrou, puis sélectionnez la commande
→ .
Une boîte de dialogue apparaît, vous permettant de saisir un commentaire, pour que les autres puissent voir pourquoi vous avez verrouillé le fichier. Le commentaire est facultatif et actuellement utilisé avec les seuls dépôts basés sur Svnserve. Si (et seulement si) vous devez voler le verrou de quelqu'un d'autre, cochez la case Voler les verrous, puis cliquez sur .
Vous pouvez positionner la propriété de projet tsvn:logtemplatelock
pour fournir un modèle de message de verrouillage à compléter par les utilisateurs. Voyez la section intitulée « Configuration des projets » pour des instructions sur comment positionner les propriétés.
Si vous sélectionnez un dossier et utilisez ensuite tous les fichiers de tous les sous-dossiers sélectionnés pour être verrouillés. C'est la bonne manière de faire si vous voulez vraiment verrouiller une arborescence complète, cependant vous pourriez devenir très impopulaire auprès de vos collègues si vous les empêchez d'accéder au projet. À utiliser avec parcimonie...
→ la boîte de dialogue Verrouiller s'ouvrira avecPour vous assurer de ne pas oublier de retirer un verrou dont vous n'avez plus besoin, les fichiers verrouillés sont affichés dans la boîte de dialogue de livraison et sélectionnés par défaut. Si vous continuez la livraison, les verrous que vous détenez sur les fichiers sélectionnés sont supprimés, même si les fichiers n'ont pas été modifiés. Si vous ne voulez pas retirer les verrous de certains fichiers, vous pouvez les décocher (s'ils ne sont pas modifiés). Si vous voulez garder un verrou sur un fichier que vous avez modifié, vous devez activer la case à cocher Garder les verrous avant de livrer vos changements.
Pour retirer un verrou manuellement, sélectionnez les fichiers de votre copie de travail dont vous voulez retirer les verrous, choisissez ensuite la commande
→ Il n'y a rien d'autre préciser, et TortoiseSVN va communiquer avec le dépôt et retirer les verrous. Vous pouvez aussi utiliser cette commande sur un dossier pour retirer tous les verrous récursivement.
Pour voir quels verrous les autres et vous détenez, vous pouvez utiliser → . Les jetons de verrouillage détenus localement s'afficheront immédiatement. Pour vérifier les verrous détenus par les autres (et voir si l'un de vos verrous est cassé ou volé) vous devez cliquer sur .
À partir du menu contextuel accessible ici, vous pouvez aussi bien obtenir et retirer des verrous, que casser et voler des verrous détenus par d'autres.
Si vous cassez ou volez le verrou de quelqu'un d'autre sans le lui dire, vous pourriez potentiellement causer une perte de travail. Si vous travaillez avec des types de fichier non fusionnables et que vous volez le verrou de quelqu'un d'autre, une fois que vous retirez le verrou, il est libre de livrer ses modifications et d'écraser les vôtres. Subversion ne perd pas de données, mais vous avez perdu la protection de travail d'équipe que le verrouillage vous avait donnée.
Comme mentionné ci-dessus, la façon la plus efficace d'utiliser le verrouillage est de mettre la propriété svn:needs-lock
sur les fichiers. Référez-vous à la section intitulée « Configuration des projets » pour les instructions sur le mode d'activation des propriétés. Les fichiers avec cette propriété activée seront toujours extraits et mis à jour avec l'attribut Lecture seule activé à moins que votre copie de travaill ne détienne un verrou.
Pour vous le rappeler, TortoiseSVN utilise une coloration spéciale pour l'indiquer.
Si vous appliquez une politique où tout fichier doit être verrouillé, vous pouvez trouver alors plus facile d'utiliser la fonctionnalité auto-props de Subversion pour activer la propriété automatiquement à chaque fois vous ajoutez de nouveaux fichiers. Lisez la section intitulée « Configuration de TortoiseSVN » pour plus d'informations.
Quand vous créez un nouveau dépôt avec Subversion 1.2 ou supérieur, quatre modèles de hooks sont créés dans le répertoire hooks
du dépôt. Ceux-ci sont appelés avant et après l'obtention d'un verrou et avant et après le retrait d'un verrou.
C'est une bonne idée d'installer un script hook post-lock
et post-unlock
sur le serveur qui envoie un e-mail indiquant que le fichier a été verrouillé. Avec une tel script d'installé, tous vos utilisateurs peuvent être informés si quelqu'un verrouille/déverrouille un fichier. Vous pouvez trouver un script hook d'exemple hooks/post-lock.tmpl
dans le dossier de votre dépôt.
Vous pourriez aussi utiliser des hooks pour ne pas permettre la casse ou le vol de verrous, ou peut-être les limiter à un administrateur nommé. Ou peut-être vous voulez envoyer un email au propriétaire quand l'un de ses verrous est cassé ou volé.
Lisez la section intitulée « Scripts hook côté serveur » pour en savoir plus.