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

119

J'ai supprimé un fichier d'un dépôt et je souhaite maintenant le remettre. Le mieux que je puisse comprendre est de:

  • mise à jour de la révision avant la suppression
  • copier les fichiers ailleurs
  • mise à 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 faire cela. J'ai déjà regardé dans le livre SVN mais je n'ai rien trouvé et je regarde maintenant la liste des balises SVN.

BCS
la source
4
La réponse de Tukushan est sûrement la bonne réponse directe à votre question, et devrait-elle être acceptée?
James McCormack
@JamesMcCormack: voyez le NB dans sa réponse.
BCS
2
Un conseil, si vous avez supprimé le fichier et n'avez pas encore validé la modification, cliquez simplement avec le bouton droit et la mise à jour le récupérera.
Hammad Khan

Réponses:

57

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 l'Explorateur, allez dans 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évisions à fusionner", spécifiez la révision qui a supprimé le fichier
  • Cochez la case "Fusion inversée", cliquez sur Suivant
  • Cliquez sur Fusionner

Cela n'a cependant pas été testé.


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

  • Accédez au dossier dont les éléments ont été supprimés
  • Faites un clic droit dans l'Explorateur, allez dans TortoiseSVN -> Fusionner ...
  • dans la section De , entrez la révision qui a effectué la suppression
  • dans la section À , entrez la révision avant la suppression.
  • Cliquez sur "fusionner"
  • commettre

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


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

Il convient également de noter que s'il y avait plusieurs changements dans la validation que vous effectuez une fusion inverse, vous voudrez annuler ces autres modifications une fois la fusion terminée avant de valider. Sinon, ces modifications supplémentaires seront également annulées.

Sean Bright
la source
Je suis sous Windows et je n'ai pas de version CLI de SVN. savez-vous comment faire faire ça à ortoiseSVN?
BCS
Tortoise a "fusionner" dans le menu contextuel. Il a des cases à remplir pour la rév. Aussi "Dry Run" pour voir si vous l'avez réglé correctement. Et rappelez-vous, le résultat ne compte que lorsque vous le validez. Vous pouvez revenir en arrière si tout tourne mal.
gbarry le
Je dirais que l'OP a une ancienne version de Tortoise. Le plus récent a une boîte de dialogue de fusion différente (inférieure)
1800 INFORMATION
Je n'ai encore vu AUCUN système de fusion qui n'ait pas été nul. Texte, fichiers, dirs, documents Word, beurk. Je pense que ce n'est pas un problème résoluble. Les choses OTOH peuvent être plus ou moins nulles. :)
BCS
1
Si vous rétablissez plusieurs fichiers puis rétablissez l'une des rétablissements, c'est l'annulation. Aie! Je pense que je viens de blesser quelque chose.
BCS
176

Le problème avec une fusion svn comme suggéré par Sean Bright est que cela réintroduit d'autres modifications apportées dans la même révision que la suppression. Une copie svn est une opération plus ciblée qui n'affectera que 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 copie de travail qui contenait précédemment le fichier.
  • Faites un clic droit sur le dossier dans l'Explorateur, allez dans 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 dans la copie de travail ..." et enregistrez.

Le fichier supprimé sera maintenant dans le dossier de copie de travail. Pour le rajouter à 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é, cependant pour voir l'historique précédent dans le journal TortoiseSVN, vous devez vous assurer que "Arrêter à la copie / renommer" est décoché dans la boîte de dialogue des messages du journal.

tekumara
la source
26
Cela peut également être effectué directement sur le serveur, utile si les fichiers ou dossiers supprimés étaient assez volumineux: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig
C'est la bonne façon de procéder. Je viens d'essayer avec TortoiseSVN 1.8.1 et cela fonctionne comme conseillé.
Dr Gianluigi Zane Zanettini
Parfait!! Simple et efficace. Merci pour la solution
Hunter
Cette méthode m'a beaucoup aidé à restaurer un fichier dans une branche enfant qui avait été supprimée de sa branche parente. Il y avait peut-être un moyen de le faire avec merge, mais je ne l'ai pas compris.
arr_sea
"Juste avant" à l'étape 3 est important. À l'étape 4, Tortoise a continué à se plaindre que le fichier existe déjà, même si je l'avais supprimé à l'aide d'une suppression Windows. J'ai d'abord dû mettre à jour ma copie de travail. (Mon collègue avait supprimé plusieurs fichiers en utilisant la suppression de Tortoise, puis avait validé les modifications.) TortoiseSVN 1.8.1.
leqid
16

Utilisez la fonctionnalité de copie de 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 faites un clic 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 faites un clic droit
  6. Sélectionnez "copier vers" qui copiera les fichiers / dossiers dans la révision principale

J'espère que cela pourra aider

Mukul Joshi
la source
13

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 également pour la restauration de répertoires entiers.

NullPoiиteя
la source
2
+1 La copie @ a fonctionné. La copie -r ne semble pas fonctionner pour l'utilisation de CollabNet svn 1.6.17 sous Mac OSX.
Gris du
2
La révision utilisée doit également être la révision juste avant la suppression.
Gris
6

Si vous utilisez Tortoise SVN, vous devriez être en mesure de restaurer les modifications de cette seule révision dans votre copie de travail (en effectuant effectivement une fusion inversée), puis de refaire un commit pour rajouter le fichier. Les étapes à suivre sont:

  1. Accédez au dossier de la copie de travail dans lequel vous avez supprimé le fichier.
  2. Accédez au navigateur repo.
  3. Accédez à la révision dans laquelle vous avez supprimé le fichier.
  4. Dans la liste des modifications, recherchez le fichier que vous avez supprimé.
  5. Cliquez avec le bouton 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. Validez le fichier pour le rajouter dans votre référentiel.
Davogones
la source
OK dans ce cas, la question était de savoir comment faire ce que vous venez de décrire. (Réponse: utiliser la fusion à l'envers)
BCS
1
Je parlais de la façon de le faire dans Tortoise SVN. J'ajouterai plus de détails.
davogones
5

Le moyen le plus simple pour moi de restaurer des fichiers et de ne pas perdre l'historique des révisions est d'utiliser la copie SVN , l'exemple de fusion ci-dessus me semble être un moyen 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 très 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 copycomme une opération de serveur, donc je ne sais pas si cela fonctionne avec deux chemins de travail.

Daniel Honig
la source
3
SVN COPY est l'approche recommandée. La syntaxe est très simple: svn copy [URL SVN] @ [RÉVISION # O LE FICHIER EXISTE] [ CHEMIN LOCAL DE RESTAURATION] depuis visualsvn.com/support/svnbook/branchmerge/basicmerging . Je viens de l'utiliser moi-même.
amit le
Cela a plus de sens pour moi, j'utilise aussi cette approche
Dmitry Pashkevich
4

Avec Tortoise SVN :

Si vous n'avez pas encore validé vos modifications, vous pouvez effectuer une restauration 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 existait encore, puis utiliser la commande Copier vers ... dans le menu contextuel. Entrez le chemin d'accès à votre copie de travail comme cible et le fichier supprimé sera copié du référentiel vers votre copie de travail.

VonC
la source
agréable. J'essaierai ça la prochaine fois.
BCS
1

Vous devriez pouvoir simplement extraire le fichier que vous souhaitez restaurer. Essayez quelque chose comme svn co svn://your_repos/path/to/file/you/want/to/restore@revoù se revtrouve la dernière révision à laquelle le fichier existait.

J'ai dû faire exactement cela il y a quelque temps et si je me souviens bien, utiliser l' -roption de svnne fonctionnait pas; J'ai dû utiliser la :revsyntaxe. (Bien que je m'en souvienne peut-être à l'envers ...)

David Z
la source
Ce n'est pas ce que je veux. Je veux patcher le fichier dans le repo et faire savoir à SVN qu'il s'agit du même fichier.
BCS