J'ai un problème avec le contrôle de version dans Subversion. J'ai extrait une copie de travail du référentiel et obtenu un verrou sur tous ses fichiers. Ensuite, sans relâcher les verrous, j'ai supprimé le dossier du disque.
Comment puis-je briser les verrous résidant dans le référentiel? J'utilise TortoiseSVN sous Windows . Existe-t-il une commande permettant de casser les verrous de manière récursive pour un dossier?
OK j'ai compris. Voici ce qui a fonctionné pour moi.
Effectuer un nettoyage SVN libérera également le verrou:
$ svn cleanup
À partir de section de verrouillage avancé
$ svn status -u
M 23 bar.c
M O 32 raisin.jpg
* 72 foo.h
Status against revision: 105
$ svn unlock raisin.jpg
svn: 'raisin.jpg' is not locked in this working copy
Cela signifie simplement que le fichier n'est pas verrouillé dans votre répertoire de travail actuel , Mais s'il est toujours verrouillé au niveau du référentiel, vous pouvez forcer le déverrouillage ("lever le verrou")
$ svn unlock http://svn.example.com/repos/project/raisin.jpg
svn: Unlock request failed: 403 Forbidden (http://svn.example.com)
$ svn unlock --force http://svn.example.com/repos/project/raisin.jpg
'raisin.jpg' unlocked.
(c'est ce que vous avez fait à travers l'interface graphique de TortoiseSVN)
Si quelqu'un d'autre a verrouillé les fichiers à distance, j'ai constaté que l'utilisation de TortoiseSVN 1.7.11 pour effectuer les opérations suivantes les a déverrouillé avec succès dans ma copie de travail. (similaire à la réponse de vikkun)
Les fichiers en copie de travail doivent maintenant être déverrouillés.
À moins que vous n'ayez un accès administrateur à la machine svn et que vous puissiez utiliser l'outil 'svnadmin', votre meilleure option semble être la suivante:
svn checkout --ignore-externals *your_repo*
svn status --show-updates
sur le référentiel extrait pour savoir quels fichiers sont potentiellement verrouillés (si quelqu'un trouve la documentation sur la signification des codes d'état, veuillez commenter).svn unlock --force *some_file*
sur les fichiers trouvés en 2.J'ai utilisé le one-liner suivant pour automatiser les versions 2 et 3:
svn status -u | head -n -1 | awk '{ print $3 }' | xargs svn unlock --force
L'administrateur du référentiel peut supprimer (de manière récursive) les verrous, en opérant sur des centaines de fichiers dans un répertoire problématique - mais uniquement par script car il n'y a pas d'option --recursive pour svnadmin rmlocks.
$repopath=/var/svn/repos/myproject/;
$problemdirectory=trunk/bikeshed/
IFS=$'\n'; for f in $(Sudo svnadmin lslocks $repopath $problemdirectory \
| grep 'Path: ' \
| sed "s/Path: \///") ; \
do Sudo svnadmin rmlocks $repopath "$f" ; done
Cette solution fonctionne avec les noms de fichiers contenant des espaces.
Si vous avez accès à l'outil svnadmin sur le serveur de référentiel, vous pouvez utiliser cette alternative pour supprimer tous les verrous (en fonction du script envoyé par VonC).
svnadmin lslocks <path_to_repo> |grep -B2 Owner |grep Path |sed "s/Path: \///" | xargs svnadmin rmlocks <path_to_repo>
Lorsque j'ai essayé d'exécuter le script ci-dessus tel que fourni à l'origine, une erreur s'est produite lors de la tentative de définition des variables: ./scriptname: line1: =/svn/repo/path /: Aucun fichier ni répertoire de ce type./nom_script: line2: = directory /: Aucun fichier ou répertoire de ce type
J'ai enlevé le '$' des deux premières lignes et cela a parfaitement fonctionné par la suite.
repopath=/var/svn/repos/myproject/;
problemdirectory=trunk/bikeshed/
IFS=$'\n'; for f in $(Sudo svnadmin lslocks $repopath $problemdirectory \
| grep 'Path: ' \
| sed "s/Path: \///") ; \
do Sudo svnadmin rmlocks $repopath "$f" ; done
Pour moi, la suppression du fichier de verrouillage dans .svn ne fonctionnait pas, car j’ai reçu une mauvaise somme de contrôle après avoir essayé de mettre à jour le fichier.
J'ai eu le message suivant après avoir exécuté svn cleanup dans le répertoire:
svn: Dans le répertoire '' svn: Impossible de copier '.svn/tmp/text-base/nom_fichier.svn-base' dans 'nomfichier.3.tmp': aucun fichier ni répertoire de ce type
J'ai donc copié mon fichier dans .svn/tmp/text-base et changé le nom en nom_fichier.svn-base. Ensuite, le nettoyage et la mise à jour ont bien fonctionné.