56 votes

Subversion: Rétractez l'enregistrement accidentel

Vous utilisez Subversion et vous copiez accidentellement du code avant qu'il ne soit prêt. Par exemple, je souvent: a) archiver du code, puis b) éditer un peu, puis c) frapper, entrer pour répéter la commande précédente qui, malheureusement, était un archivage.

Est-il possible de retirer un tel enregistrement accidentel du serveur avec subversion?

70voto

Brian Agnew Points 143181

Voir le Livre Rouge, plus précisément le "Annulation des Modifications" de la section, et à l'inverse de la fusion.

Une autre utilisation courante svn merge est de restaurer un changement qui a déjà été commis. Supposons que vous travaillez joyeusement sur une copie de travail de /calc/trunk, et vous découvrez que le changement fait le chemin du retour à la révision 303, qui a changé entier.c, est complètement faux. Il n'aurait jamais été commis. Vous pouvez utiliser svn merge de "défaire" le changement dans votre copie de travail, puis de valider la modification locale dans le référentiel. Tout ce que vous devez faire est de spécifier un revers de la différence:

$ svn merge-r 303:302 http://svn.example.com/repos/calc/trunk

Afin de clarifier, de votre changement initial va encore être dans le référentiel. Mais vous avez maintenant rentrés dans une révision ultérieure. c'est à dire le référentiel a capturé tous vos modifications (qui est vraiment ce que vous voulez! Sauf si vous avez coché l'option dans un mot de passe en clair ou similaire!)

17voto

David Fraser Points 1792

NB: Normalement, lorsque vous vous êtes enregistré par erreur, il suffit de revenir à la commettre - voir les autres réponses à cette question. Toutefois, si vous voulez savoir comment annuler les effets de la validation et de modifier le référentiel être de savoir comment il était avant, il y a quelques explications ci-dessous:

Ce n'est pas ce que vous souhaitez l'utiliser, mais si vous vraiment voulez supprimer le réel version validée à partir du référentiel, alors vous pouvez faire un méchant de restauration sur le référentiel comme suit (ce qui suppose que $REV est fixé pour la révision la plus récente, que vous êtes en train de supprimer):

  • Faire revenir votre copie locale de la révision précédente afin de ne pas se confondre (svn revert -r $((REV-1)))
  • Dans le référentiel, retirez - db/revs/$REV et db/revprops/$REV
  • Dans le référentiel, retirez - db/current et (pour subversion 1.6 ou plus) db/rep-cache.db, et exécutez svnadmin recover .

Tout cela suppose:

  • Vous êtes à l'aide d'un fsfs-référentiel
  • La Subversion la libération de plus de 1.5.0 (sinon, vous devrez modifier manuellement db/current et de modifier le numéro de révision plutôt que de courir en svnadmin recover .)
  • Pas d'autres révisions suivantes ont été commis
  • Vous avez accès en écriture pour le système de fichiers du référentiel
  • Vous n'êtes pas peur de quelqu'un d'autre essaie d'y accéder pendant que vous faites le au-dessus de

Je l'ai fait quand un énorme fichier a été commis dans un référentiel que je n'ai pas envie de rester dans l'histoire (et de miroirs, etc) pour toujours; il n'est pas en aucune façon idéale ou une pratique normale...

14voto

Pete Points 153

AVERTISSEMENT: La accepté de répondre (par David Fraser) doit travailler avec un SVN 1.5 référentiel, mais avec SVN 1.6 vous devez également supprimer db/rep-cache.db avant le prochain commit ou vous allez corrompre votre référentiel et ne pouvez pas le réaliser, jusqu'à la prochaine fois que vous essayez une check-out complet. J'ai vu ultérieure complète extractions échouer avec un "mal formé représentation de l'en-tête" erreur.

Qu'est-rep-cache.db, vous pouvez demander? La documentation sur le FSFS disposition dit que vous allez perdre "rep des capacités de partage" si vous supprimez ce fichier; toutefois, il sera recréé lors de votre prochain commit. La représentation de partage a été ajouté en 1.6.

12voto

Jamie Ide Points 28680

À l’aide de TortoiseSVN, sélectionnez Afficher le journal et localisez la révision à laquelle vous souhaitez revenir. Dans le menu contextuel, sélectionnez Revenir à cette révision. Cela effectue une fusion inversée dans votre copie de travail, vous devrez donc valider votre copie de travail pour terminer l'opération.

Voir aussi http://stackoverflow.com/questions/747597/how-do-we-keep-track-of-our-working-copys-branch :-)

6voto

AndreasT Points 2329

Si ce que vous voulez dire, comment puis-je enlever proprement l'histoire d'une perte accidentelle de l'archivage: Cela est difficile.

svn ne vous permet pas d'annuler quoi que ce soit depuis qu'il enregistre les révisions révisions. Cependant, il existe quelques outils qui vous permettent de faire presque n'importe quoi sur un dump d'un référentiel. Vous pourriez:

  1. Dump de votre repo.

  2. Utilisation svndumpfilter à partir du svn-les outils d'administration à se débarrasser de l'enregistrement.

  3. Le remettre dans le repo.

Mais cela peut complètement ruiner votre repo, jamais, jamais, jamais essayer de le faire, sauf si vous devez absolument savoir ce que vous faites et ont tout sauvegardé.

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