SVN annuler la suppression avant la validation

135

Si vous supprimez un répertoire d'une copie de travail SVN, mais que vous ne l'avez pas encore engagé, il n'est pas évident de savoir comment le récupérer. Google suggère même "svn undo delete before commit" comme requête courante lorsque vous tapez "svn undo d", mais les résultats de la recherche ne sont pas utiles.

edit: j'aimerais une solution qui fonctionne dans la subversion 1.4.4

Lac
la source
Y a-t-il des répertoires frères à celui que vous avez supprimé avec des modifications en attente? Si tel est le cas, soyez prudent lorsque vous revenez d'un niveau supérieur, vous risquez de perdre des modifications.
Russell

Réponses:

145

svn revert deletedDirectory

Voici la documentation de la svn revertcommande.


ÉDITER

Si a deletedDirectoryété supprimé avec rmdiret non svn rm, vous devrez le faire

svn update deletedDirectory

au lieu.

Michael Hackner
la source
3
Cela doit être nouveau, cela ne fonctionne pas dans SVN 1.4.4. (C'était la première chose que j'ai essayée.)
LaC
4
C'est ce que dit la 1.4.4, btw: $ svn help revert revert: Restaure le fichier de copie de travail vierge (annule la plupart des modifications locales). usage: revert PATH ... Remarque: cette sous-commande ne nécessite pas d'accès au réseau et résout tout état de conflit. Cependant, il ne restaure pas les répertoires supprimés.
LaC
1
1.6.6 a le même texte dans l'aide, mais cela a fonctionné pour moi lorsque je l'ai testé. Notez que si vous n'avez pas utilisé svn deletepour supprimer le répertoire, mais rmdirque vous l'avez plutôt supprimé avec , vous devrez à la svn update deletedDirectoryplace.
Michael Hackner
J'ai supprimé un fichier (svn del) d'un répertoire svn-ed local. svn update n'a pas fonctionné mais svn revert a fonctionné. J'utilisais SynchroSVN pour Mac. Cependant, merci pour les conseils.
karim
5
Selon le lien, utilisez svn -R revert pour annuler la suppression de tout le répertoire avec tout le contenu, ce qui est probablement ce que vous voulez. svn revert sans -R restaure simplement le répertoire, pas le contenu.
n13
156

1) faire

svn revert . --recursive

2) analyser la sortie pour des erreurs comme

"Failed to revert 'dir1/dir2' -- try updating instead."

3) appelez svn pour chacun des répertoires d'erreur:

svn up dir1/dir2
Denis Barmenkov
la source
12
C'est la réponse la plus précise, merci beaucoup, vous m'avez beaucoup aidé.
greenoldman
1
Sauf que ça annule tout? Vous ne voudrez peut-être pas faire cela.
n13
1
Cela a plus de sens si vous avez un dossier entier que SVN pense avoir été supprimé. Je l'ai eu en vérifiant une copie de travail. Un dossier existait déjà, il a donc été placé en conflit et n'a pas été extrait. C'était un lien vers un autre dossier. Je l'ai renommé et essayé svn upde le faire vérifier, j'ai réalisé le conflit, je l'ai fait svn resolved fooet svn statusj'ai dit que j'avais environ 10k fichiers marqués comme D. svn upet svn revertne les a pas récupérés, mais cela a résolu le problème.
simbabque
6
+1 pour --recursivequi aide à restaurer le contenu des répertoires supprimés.
Melebius
1
Oh mon Dieu, tu as sauvé ma soirée!
ArturOlszak
32

Ce qui a fonctionné pour moi c'est

svn revert --depth infinity deletedDir
Jason
la source
Cela a très bien fonctionné pour moi (svn 1.7.10) où svn revert suppriméDir n'a pas réussi à faire le travail. Excellente réponse.
rtome
4

Effectuez une opération de restauration (récursive) à partir d'un niveau supérieur au répertoire que vous avez supprimé.

Greg Hewgill
la source
1
Cela effacera BEAUCOUP plus de changements que nécessaire.
Michael Hackner
Cela ne fonctionne pas avec Subversion 1.4.4 (je viens de l'essayer). svn help revert dit même que "cette sous-commande ne nécessite pas d'accès au réseau et résout tout état de conflit. Cependant, elle ne restaure pas les répertoires supprimés." Je suis désolé, j'aurais dû spécifier la version. La version 1.4.4 est fournie avec Mac OS X 10.5.
LaC
4

Pour en faire une seule doublure, vous pouvez essayer quelque chose comme:

svn status | cut -d ' ' -f 8 | xargs svn revert
Earle
la source
Je peux créer un répertoire avec des espaces dans son nom. Il peut casser AFAIK «coupé».
Denis Barmenkov
1

La solution la plus simple que j'ai pu trouver était de supprimer le répertoire parent de la copie de travail (avec rm -rf, pas svn delete), puis d'exécuter svn update dans le grand-parent. Par exemple, si vous avez supprimé a / b / c, rm -rf a / b, cd a, svn up. Cela ramène tout. Bien sûr, ce n'est une bonne solution que si vous n'avez aucune autre modification non validée dans le répertoire parent que vous souhaitez conserver.

J'espère que cette page sera en haut des résultats la prochaine fois que je google cette question. Ce serait encore mieux si quelqu'un suggérait une méthode plus propre, bien sûr.

Lac
la source
Cela suppose qu'il n'y a pas de sous-répertoires dans le parent qui ont des modifications en attente.
Russell
0

Vous pouvez supprimer le dossier et mettre à jour le répertoire parent avant de valider:

rm -r some_dir

svn update some_dir_parent

xinthose
la source