255 votes

Que faire lorsque le nettoyage de svn échoue ?

J'ai beaucoup de changements dans un dossier de travail, et quelque chose a foiré en essayant de faire une mise à jour.

Maintenant, lorsque je lance un "svn cleanup", j'obtiens :

>svn cleanup .
svn: In directory '.'
svn: Error processing command 'modify-wcprop' in '.'
svn: 'MemPoolTests.cpp' is not under version control

MemPoolTests.cpp est un nouveau fichier qu'un autre développeur a ajouté et qui a été supprimé lors de la mise à jour. Il n'existait pas dans mon dossier de travail auparavant.

Y a-t-il quelque chose que je puisse faire pour essayer d'aller de l'avant sans d'avoir à extraire une nouvelle copie du référentiel ?

Clarification : Merci pour les suggestions concernant le déplacement du répertoire et la création d'une nouvelle copie. Je sais que c'est une option, mais je voudrais l'éviter car il y a beaucoup de changements imbriqués dans plusieurs répertoires profonds (cela aurait dû être une branche...) Ce que j'espère, c'est une façon plus agressive de faire le nettoyage, peut-être une façon de forcer le fichier avec lequel svn a des problèmes à revenir dans un état connu (et j'ai essayé de supprimer la copie de travail de celui-ci... cela n'a pas aidé).

228voto

Quand tout recommencer n'est pas une option...

J'ai supprimé le fichier journal dans le répertoire .svn (j'ai également supprimé le fichier incriminé dans .svn/props-base).

Puis j'ai fait un nettoyage

Puis j'ai repris ma mise à jour.

120voto

JKoplo Points 191

Les choses ont changé avec SVN 1.7, et la solution populaire de supprimer le fichier journal dans le répertoire .svn n'est pas réalisable avec le passage à une implémentation de copie de travail de base de données.

Voici ce que j'ai fait et qui semble fonctionner :

  1. Supprimez le répertoire .svn de votre copie de travail.
  2. Commencez un nouveau checkout dans un nouveau répertoire temporaire.
  3. Annulez le paiement (nous ne voulons pas attendre que tout soit retiré).
  4. Exécutez un nettoyage sur cette caisse annulée.
  5. Maintenant, nous avons un nouveau répertoire .svn avec une base de données propre (bien qu'il y ait peu ou pas de fichiers).
  6. Copiez ce .svn dans votre ancien répertoire de travail corrompu.
  7. Exécutez svn update et cela devrait mettre votre nouveau répertoire partiel .svn à niveau avec votre ancien répertoire de travail.

C'est un peu confus comme processus. Essentiellement, ce que nous faisons est de supprimer le .svn corrompu et de créer un nouveau .svn pour le même chemin de sortie. Nous déplaçons ensuite ce nouveau .svn dans notre ancien répertoire de travail et le mettons à jour dans le dépôt.

Je viens de le faire dans TSVN et il semble que cela fonctionne bien et ne nécessite pas un checkout complet et un téléchargement.

-Jody

116voto

Siva Points 142

Jetez un coup d'œil à

http://www.anujvarma.com/svn-cleanup-failedprevious-operation-has-not-finished-run-cleanup-if-it-was-interrupted/

Résumé de la correction du lien ci-dessus (Merci à Anuj Varma)

  1. Installez sqllite (binaire 32 bits pour Windows) à partir de aquí

  2. sqlite .svn/wc.db "select * from work_queue"

Le SELECT devrait vous montrer le dossier/fichier incriminé comme faisant partie de la file d'attente. Ce que vous devez faire, c'est supprimer cet élément de la file d'attente.

 3. sqlite .svn/wc.db “delete from work_queue”

C'est ça. Maintenant, vous pouvez relancer le nettoyage - et ça devrait marcher. Ou vous pouvez passer directement à la tâche que vous étiez en train d'effectuer avant d'être invité à exécuter le nettoyage (ajout d'un nouveau fichier, etc.).

42voto

Martin Beckett Points 60406

Si tout le reste échoue :

  1. Extraction dans un nouveau dossier.
  2. Copiez vos fichiers modifiés.
  3. Revenez nous voir.
  4. zippez l'ancien dossier quelque part (on ne sait jamais + la paranoïa a du bon) avant de le supprimer et d'utiliser le nouveau.

16voto

Ken Points 23619

Subversion stocke ses informations par dossier (dans .svn), donc si vous ne traitez qu'un sous-dossier vous n'avez pas besoin de vérifier tout le dépôt - juste le dossier qui a bogué :

cd dir_above_borked
mv borked_dir borked_dir.bak
svn update borked_dir

Cela vous donnera une bonne copie de travail du dossier borked mais vous aurez toujours vos changements sauvegardés dans borked_dir.bak . Le même principe s'applique avec Windows/tortoise

si vous avez des changements dans un dossier isolé, regardez dans les

svn checkout -N borked_dir   # non-recursive but deprecated

ou

svn checkout --depth=files borked_dir 
# depth is new territory  to me but svn help checkout

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X