web-dev-qa-db-fra.com

Comment puis-je libérer des verrous dans Subversion de manière récursive?

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.

  • Je ne peux pas supprimer le dossier du référentiel, car il a un verrou
  • Si je tente de libérer les verrous de manière récursive, cela signifie qu'il n'y a pas de verrous à libérer.
  • Dans la vue Parcourir le référentiel, je ne peux briser les verrous que sur des dossiers particuliers, pas de manière récursive.

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?

48
vikmalhotra

OK j'ai compris. Voici ce qui a fonctionné pour moi.

  • Extraire une copie de travail
  • Allez ensuite dans le menu de Windows Explorer, TortoiseSVN -> Rechercher les modifications.
  • Cliquez sur le bouton Vérifier le référentiel
  • Sélectionnez Tous les fichiers, cliquez avec le bouton droit etsélectionnez l'option de verrouillage de la rupture.
  • Supprimez la copie de travail et le référentiel onein. Voila! :)
56
vikmalhotra

Effectuer un nettoyage SVN libérera également le verrou:

$ svn cleanup
31
rgubby

À 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)

17
VonC

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)

  • Faites un clic droit sur la copie de travail> Vérifier les modifications
  • Cliquez sur le bouton Vérifier le référentiel
  • Sélectionnez les fichiers que vous souhaitez déverrouiller
  • Clic droit> Obtenir le verrou
  • Cochez la case "voler le verrou"
  • Une fois le verrou volé, sélectionnez à nouveau
  • Clic droit> déverrouiller

Les fichiers en copie de travail doivent maintenant être déverrouillés.

6
Dan

À 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:

  1. Extraire le répertoire problématique en utilisant svn checkout --ignore-externals *your_repo*
  2. Utilisez 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).
  3. Utilisez 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
3
Apteryx

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.

2
Greg Rundlett

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>
2
Gustavo Cipriani

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
0
EricMG

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é.

0
Greg