2009-01-30 10 views
60

Ces instructions sont un peu intimidantes et déroutantes: http://svnbook.red-bean.com/en/1.0/ch04s04.html#svn-ch-4-sect-4.3. Et aussi ils ne semblent pas mentionner que c'est beaucoup plus simple si vous ne vous êtes pas encore enregistré après avoir fait le "svn rm" [1].Quel est un moyen simple de restaurer un fichier dans subversion?

Alors j'ai pensé que ce serait un bon endroit pour enregistrer une réponse plus simple pour ceux qui recherchent pour cela.

[1] Pour un débutant svn, il peut sembler que "svn rm" détruit immédiatement le fichier. Je me souviens avoir fait svn rm en pensant que cela le supprimerait du contrôle de la source et flipperait quand le fichier lui-même aurait disparu. Donc, une sous-question est, quelle est la bonne façon de supprimer un fichier du contrôle de version sans réellement supprimer votre copie locale?

+0

'svn status | grep "^ D" | awk '{print $ 2}' | xargs svn revert' – sfiore

Répondre

73

Si vous venez de faire

svn rm foo.txt 

alors vous pouvez le défaire avec simplement

svn revert foo.txt 

Si vous déjà enregistré après avoir fait alors « svn rm » vous pouvez regarder le journal (svn log) , recherchez la dernière révision où le fichier existait et récupérez-la à partir de cette version.

Une façon de faire est de fusionner dans l'ancienne révision qui a le fichier. En supposant que la révision en cours est 123 et la dernière version avec ce fichier est de 120, faites ceci:

svn merge -r123:120 

Peut-être d'abord faire un essai sec pour vous assurer qu'il ne fera rien que vous ne voulez pas:

svn --dry-run merge -r123:120 

pour la sous-question, comment supprimer un fichier de svn sans supprimer la copie locale:

svn rm foo.txt --keep-local 

Ou , Bien sûr, vous pouvez simplement copier dans un fichier temporaire avant svn rm'ing puis retransférer:

cp foo.txt foo.txt-tmp 
svn rm foo.txt 
(svn ci -m "just removed foo.txt from the repository") 
cp foo.txt-tmp foo.txt 
+0

Le problème avec la fusion est qu'elle perd l'historique précédent du fichier. svn cp comme détaillé dans la réponse de Stefan est probablement mieux, ainsi que plus facile à comprendre. – Avi

+0

Bonne réponse, enregistré ma journée. Merci! pls1 –

+0

J'ai trouvé si changer l'ordre de la version, il est seulement ajouter le fichier supprimé à la copie de travail en cours, sans autres changements de fichier non supprimé, par exemple. 'svn merge -r120: 123 svn_url .' – zhuguowei

30

Pour supprimer un fichier, mais conservez-le dans la copie de travail, utilisez

svn rm foo.txt --keep-local 

Pour récupérer un fichier après avoir validé la suppression, vous pouvez utiliser la commande merge ou la commande copy - les deux conserveront l'historique du fichier. Depuis la voie de fusion est déjà décrit ailleurs, voici la façon dont la copie:

svn rm foo.txt 
svn ci foo.txt -m "removed file" 
(now at r5 as an example) 
svn cp url/to/removed/foo.txt -r4 foo.txt 
svn ci foo.txt -m "got file back" 
+7

Pour que je puisse travailler, la commande de copie doit être un peu différente: svn cp url/to/removed/[email protected] -r4 foo.txt ---- sans le @ 4 j'obtiens une erreur "path not found" – Barth

33

pour une raison quelconque, le -r arg ne fonctionnait pas pour moi (version 1.6.9 svn). J'ai essayé avant et après le src, mais j'ai continué à recevoir un message que le fichier n'a pas été trouvé dans la révision en cours (duh). Pareil avec --revision. En utilisant la syntaxe de style @ travaillé bien:

svn cp url/to/removed/[email protected] foo.txt 
+1

C'était la seule commande qui a fonctionné pour moi. SVN 1.6.15 –

+0

Ne sait jamais quelle est la façon la plus simple de déterminer la dernière version de travail, mais cette déclaration est en or. –

1

i utilisé l'élément de menu de copie de la version précédente en utilisant la tortue, a travaillé pour moi et gardé l'histoire.

+1

Sonorités prometteuses, pouvez-vous donner plus de détails? D'où émettez-vous exactement la commande de copie? – VdesmedT

1

Pour annuler un fichier supprimé dans SVN. Trouvez le numéro de révision juste avant de supprimer (disons 341).Ensuite, retournez ce fichier seul à ce numéro de révision.

svn up -r341 [path_to_deletedFile] 
+0

Cela obtient une autre copie locale, mais le fichier reste "supprimé" dans le référentiel. Votre prochain "svn up" le verra disparaître. – UncaAlby

Questions connexes