web-dev-qa-db-fra.com

Quelle est la bonne façon de restaurer un fichier supprimé de SVN?

J'ai supprimé un fichier d'un référentiel et je souhaite maintenant le remettre en place. Le mieux que je puisse comprendre est de:

  • mettre à jour la révision avant la suppression
  • copier les fichiers ailleurs
  • mettre à jour à la tête
  • recopier les fichiers
  • ajoutez-les
  • commettre

Cela sent juste mauvais et il perd toute l'histoire pour démarrer. Il doit y avoir un meilleur moyen de le faire. J'ai déjà regardé dans le livre SVN mais je n'ai rien trouvé et je regarde maintenant la liste des tags SVN.

110
BCS

Utilisez svn merge:

svn merge -c -[rev num that deleted the file] http://<path to repository>

Donc, un exemple:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Pour TortoiseSVN (je pense ...)

  • Faites un clic droit dans Explorer, allez à TortoiseSVN -> Fusionner ...
  • Assurez-vous que "Fusionner une plage de révisions" est sélectionné, cliquez sur Suivant.
  • Dans la zone de texte "Plage de révision à fusionner", spécifiez la révision qui a supprimé le fichier.
  • Cochez la case "Reverse merge", cliquez sur Next
  • Cliquez sur Fusionner

C'est complètement non testé, cependant.


Edité par OP : Cela fonctionne sur ma version de TortoiseSVN (l'ancien type sans le bouton suivant)

  • Allez dans le dossier où ça a été supprimé.
  • Faites un clic droit dans Explorer, allez à TortoiseSVN -> Fusionner ...
  • dans la section From, entrez la révision qui a supprimé
  • dans la section To, entrez la révision avant la suppression.
  • Cliquez sur "fusion"
  • commettre

L'astuce consiste à fusionner à l'envers . Bravo à sean.bright pour m'avoir dirigé dans la bonne direction!


Edit: Nous utilisons différentes versions. La méthode que j'ai décrite a parfaitement fonctionné avec ma version de TortoiseSVN.

Il est également à noter que s'il y a eu plusieurs modifications dans la validation, vous effectuez une fusion inverse, vous voudrez annuler ces autres modifications une fois la fusion effectuée avant la validation. Si vous ne le faites pas, ces modifications supplémentaires seront également annulées.

55
Sean Bright

Le problème de faire une fusion svn, comme suggéré par Sean Bright, consiste à réintroduire d'autres modifications apportées dans la même révision que la suppression. Une copie de svn est une opération plus ciblée qui n’affectera que les fichiers supprimés.

Tortoise SVN vous permet de ressusciter un fichier qui a été supprimé de votre répertoire de copie de travail et de révisions SVN ultérieures, via une copie svn comme suit:

  • Accédez au dossier de la copie de travail contenant auparavant le fichier.
  • Faites un clic droit sur le dossier dans l'explorateur, allez à TortoiseSVN -> Show log.
  • Faites un clic droit sur le numéro de révision juste avant la révision qui a supprimé le fichier et sélectionnez "Parcourir le référentiel".
  • Faites un clic droit sur le fichier supprimé et sélectionnez "Copier dans une copie de travail ..." et enregistrez.

Le fichier supprimé sera maintenant dans le dossier de la copie de travail. Pour le ré-ajouter à SVN, cliquez avec le bouton droit sur le fichier restauré et sélectionnez SVN Commit.

NB: Cette méthode préservera l'historique précédent du fichier restauré. Toutefois, pour voir l'historique précédent dans le journal TortoiseSVN, vous devez vous assurer que "Arrêter la copie/le nom renommé" est décoché dans la boîte de dialogue Messages de journal.

166
tekumara

Pour être complet, voici ce que vous auriez trouvé dans le livre svn, si vous aviez su quoi rechercher. C'est ce que vous avez déjà découvert:

Annulation des modifications

ressuscitation des éléments supprimés

Même chose, de la version plus récente (et détaillée) du livre:

Annulation des modifications

ressuscitation des éléments supprimés

27
gbarry

Utilisez la fonctionnalité de copie Tortoise SVN pour annuler les modifications validées:

  1. Cliquez avec le bouton droit sur le dossier parent contenant les fichiers/dossiers supprimés.
  2. Sélectionnez le "show log"
  3. Sélectionnez et cliquez avec le bouton droit sur la version avant laquelle les modifications/supprimées ont été effectuées.
  4. Sélectionnez le "parcourir le référentiel"
  5. Sélectionnez le fichier/dossier à restaurer et cliquez avec le bouton droit de la souris.
  6. Sélectionnez "Copier vers" pour copier les fichiers/dossiers dans la révision principale.

J'espère que ça t'as aidé

16
Mukul Joshi

Je semble toujours utiliser svn copy comme une opération de serveur, donc je ne sais pas si cela fonctionne avec deux chemins de travail.

Voici un exemple de restauration d'un fichier supprimé dans une copie de travail locale du projet:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Tout en étant dans le répertoire du projet. Cela fonctionne aussi bien pour la restauration de répertoires entiers.

12
NullPoiиteя

Si vous utilisez Tortoise SVN, vous devriez être en mesure de revenir sur votre copie de travail (en effectuant une fusion inversée), puis d'effectuer un autre commit pour ré-ajouter le fichier. Les étapes à suivre sont:

  1. Accédez au dossier de la copie de travail où vous avez supprimé le fichier.
  2. Aller au repo-browser.
  3. Naviguez jusqu'à la révision où vous avez supprimé le fichier.
  4. Dans la liste des modifications, recherchez le fichier que vous avez supprimé.
  5. Faites un clic droit sur le fichier et allez à "Annuler les modifications de cette révision".
  6. Cela restaurera le fichier sur votre copie de travail en conservant l'historique.
  7. Commettez le fichier pour le rajouter dans votre référentiel.
5
davogones

Avec Tortoise SVN :

Si vous n'avez pas encore validé vos modifications, vous pouvez rétablir le dossier parent dans lequel vous avez supprimé le fichier ou le répertoire.

Si vous avez déjà validé le fichier supprimé, vous pouvez utiliser le navigateur de référentiel, passer à la révision où le fichier existait toujours, puis utiliser la commande Copier vers ... du menu contextuel. Entrez le chemin d'accès à votre copie de travail en tant que cible et le fichier supprimé sera copié du référentiel vers votre copie de travail.

4
VonC

Le moyen le plus simple de restaurer des fichiers sans perdre l'historique des révisions est d'utiliser copie SVN, l'exemple de fusion ci-dessus me semble être un moyen plus complexe d'atteindre le même objectif. Pourquoi est-il nécessaire de fusionner lorsque vous souhaitez simplement restaurer une révision?

J'utilise ce qui suit dans cet exemple et cela fonctionne assez bien.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Je semble toujours utiliser svn copy en tant qu'opération de serveur, vous ne savez donc pas si cela fonctionne avec deux chemins de travail.

4
Daniel Honig

Vous devriez pouvoir extraire le fichier que vous voulez restaurer. Essayez quelque chose comme svn co svn://your_repos/path/to/file/you/want/to/restore@revrev est la dernière révision à laquelle le fichier a existé.

Je devais faire exactement cela il y a quelques temps et si je me souviens bien, utiliser l'option -r Pour svn ne fonctionnait pas; Je devais utiliser la syntaxe :rev. (Bien que j'aie pu m'en souvenir à l'envers ...)

0
David Z