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

J’ai supprimé un fichier d’un repository et je veux le remettre. Le mieux que je puisse comprendre est de:

  • mise à jour de la révision avant la suppression
  • copier les fichiers ailleurs
  • mettre à jour à la tête
  • recopiez les fichiers
  • Ajoutez-les
  • commettre

Cela sent juste mauvais et il perd toute l’histoire pour démarrer. Il doit y avoir une meilleure façon de le faire. J’ai déjà consulté le livre SVN, mais je n’ai rien trouvé et je regarde maintenant la liste des tags SVN.

Utilisez svn merge:

svn merge -c -[rev num that deleted the file] http:// 

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 l’explorateur, 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 “Inverser la fusion”, cliquez sur Suivant
  • Cliquez sur Fusionner

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


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

  • Allez dans le dossier qui a été supprimé de
  • Faites un clic droit dans l’explorateur, allez à TortoiseSVN -> Fusionner …
  • dans la section De entrez la révision qui a fait la suppression
  • dans la section À , entrez la révision avant la suppression.
  • Cliquez sur “fusionner”
  • commettre

L’astuce consiste à fusionner en arrière . Bravo à Sean.bright pour m’avoir orienté dans la bonne direction!


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

Il convient également de noter que si plusieurs modifications ont été apscopes à la validation, vous devez fusionner ces modifications une fois la fusion terminée avant de valider. Si vous ne le faites pas, ces changements supplémentaires seront également inversés.

Le problème lié à la fusion svn, comme suggéré par Sean Bright, est qu’il réintroduit d’autres modifications apscopes à la même révision que la suppression. Une copie svn est une opération plus ciblée qui affectera uniquement les fichiers supprimés.

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

  • Accédez au dossier de la copie de travail contenant précédemment le fichier.
  • Faites un clic droit sur le dossier dans l’Explorateur, accédez à TortoiseSVN -> Afficher le journal.
  • 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 sur la copie de travail …” et enregistrez.

Le fichier supprimé sera maintenant dans le dossier de la copie de travail. Pour le rappend à nouveau à SVN, faites un clic droit sur le fichier restauré et sélectionnez SVN Commit.

NB: Cette méthode conservera l’historique précédent du fichier restauré. Toutefois, pour afficher l’historique précédent dans le journal TortoiseSVN, vous devez vous assurer que l’option “Arrêter sur copie / renommer” est désactivée dans la boîte de dialog Messages du journal.

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

Annuler les modifications

Ressusciter des éléments supprimés

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

Annuler les modifications

Ressusciter des éléments supprimés

Utilisez la fonctionnalité de copie SVN de Tortoise 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 / suppressions ont été effectuées
  4. Sélectionnez le “référentiel de navigation”
  5. Sélectionnez le fichier / dossier à restaurer et faites un clic droit
  6. Sélectionnez “copier vers” pour copier les fichiers / dossiers dans la révision de la tête

J’espère que cela pourra aider

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 

En étant dans le répertoire du projet. Cela fonctionne également pour la restauration de répertoires entiers.

Si vous utilisez SVN Tortoise, vous devriez être en mesure de revenir à des modifications de cette seule révision dans votre copie de travail (effectuez effectivement une fusion inverse), puis effectuez une autre validation pour rappend le fichier. Les étapes à suivre sont les suivantes:

  1. Recherchez le dossier dans la copie de travail où vous avez supprimé le fichier.
  2. Allez dans repo-browser.
  3. Accédez à la révision où vous avez supprimé le fichier.
  4. Dans la liste des modifications, recherchez le fichier que vous avez supprimé.
  5. Cliquez avec le bouton droit de la souris sur le fichier et accédez à “Rétablir les modifications de cette révision”.
  6. Cela restaurera le fichier sur votre copie de travail, en conservant l’historique.
  7. Validez le fichier pour l’append dans votre référentiel.

Avec Tortoise SVN :

Si vous n’avez pas encore commis vos modifications, vous pouvez effectuer un retour sur le dossier parent où 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 existe toujours, puis utiliser la commande Copier dans … du menu contextuel. Entrez le chemin d’access à votre copie de travail en tant que cible et le fichier supprimé sera copié du référentiel vers votre copie de travail.

La manière la plus simple de restaurer des fichiers sans perdre l’historique des révisions est d’utiliser la copie SVN , l’exemple de fusion ci-dessus me semble être une façon plus complexe de réaliser la même chose. Pourquoi est-il nécessaire de fusionner lorsque vous souhaitez simplement restaurer une révision?

J’utilise ce qui suit dans ce cas et cela fonctionne assez bien.

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

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.

Vous devriez être en mesure de simplement vérifier le fichier que vous souhaitez 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 existait.

Je devais faire exactement cela il y a peu de temps et si je me souviens bien, utiliser l’option -r pour svn ne fonctionnait pas; J’ai dû utiliser la syntaxe :rev . (Bien que j’aie pu m’en souvenir à l’envers …)