Existe-t-il une commande Subversion pour réinitialiser la copie de travail?

110

Existe-t-il une seule commande Subversion qui «réinitialiserait» une copie de travail exactement à l'état stocké dans le référentiel? Quelque chose comme git reset --hardou (ha, la réinitialisation matérielle de Git ne supprime pas non plus les fichiers non versionnés!) rm -rf wc && svn co <url> wc.

Mise à jour: je ne suis pas après un simple retour, car cela ne supprime pas les fichiers supplémentaires dans la copie de travail. Je veux vraiment quelque chose qui équivaudrait à supprimer la copie de travail et à la vérifier à nouveau, mais sans avoir à télécharger à nouveau les données. (Évidemment, cela ne me dérange pas de perdre tous les changements non validés.)

zoul
la source
annuler toutes les modifications de la copie de travail?
mauris
5
Vous utiliseriez git clean -xdfpour supprimer les éléments qui ne sont pas sous contrôle de code source.
vcsjones
1
@vcsjones: Merci, la page de manuel pour git cleancite exactement ce que je recherche: "Cela peut être utilisé (éventuellement en conjonction avec git reset) pour créer un répertoire de travail vierge pour tester une version propre." Dommage que Subversion ne semble pas avoir quelque chose comme ça intégré.
zoul

Réponses:

180

Vous pouvez revenir de manière récursive comme ceci:

svn revert --recursive .

Il n'y a aucun moyen (sans écrire un script créatif) de supprimer des éléments qui ne sont pas sous contrôle de code source. Je pense que le plus proche que vous puissiez faire est d'itérer sur tous les fichiers, d'utiliser alors grep le résultat de svn list, et si le grep échoue, supprimez-le.

EDIT : La solution pour le script de création est ici: supprimer automatiquement les fichiers non versionnés de Subversion

Vous pouvez donc créer un script qui combine un revertavec la réponse de la question liée qui vous convient le mieux.

vcsjones
la source
3
Vous voudrez peut-être également courir svn cleanupsur les toilettes. C'est ma pratique standard pour nettoyer après des fusions avortées et ainsi de suite.
Mike Miller
tortoise a également une option "supprimer les fichiers non versionnés" dans la boîte de dialogue de nettoyage.
v.oddou
2
Ce serait bien si le "supprimer les fichiers non versionnés" était disponible via la ligne de commande. Surtout pour les builds automatisés.
C. Tewalt
3
Voir ma réponse ... --remove-unversioned existe pour svn cleanup
Denny Weinberg
38

Pour rétablir les fichiers suivis

svn revert . -R

Pour nettoyer les fichiers non suivis

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Le -rfpeut / devrait sembler effrayant au début, mais une fois compris, ce ne sera pas pour ces raisons:

  1. Seuls les répertoires entièrement non suivis correspondront au modèle transmis à rm
  2. Le -rfest obligatoire, sinon ces répertoires ne seront pas supprimés

Pour revenir en arrière puis nettoyer (la question OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Pour une facilité d'utilisation constante

Ajoutez un alias permanent à vos .bash_aliases

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'
niklauzg
la source
le 2ème extrait ne semble pas fonctionner pour moi:awk: fatal: error reading input file '-': Input/output error
hbogert
J'ai dû échapper ?à la awkcommande, sinon cela correspondait à toutes les lignes de la sortie desvn status
gpanders
23

Supprimez tout ce qui se trouve dans votre copie locale en utilisant:

rm -r your_local_svn_dir_path/*

Et tout revenir récursivement en utilisant la commande ci-dessous.

svn revert -R your_local_svn_dir_path

C'est beaucoup plus rapide que de supprimer tout le répertoire, puis de procéder à une nouvelle extraction, car les fichiers sont en cours de restauration à partir de vos métadonnées SVN locales. Il n'a même pas besoin d'une connexion réseau.

Vivek Yadav
la source
4
bien plus rapide est svn cleanup --remove-unversioned.
Znik
7
svn revert . -R

pour tout réinitialiser.

svn revert path/to/file

pour un seul fichier

Abe Voelker
la source
1
Cela ne supprime pas les fichiers non versionnés supplémentaires dans la copie de travail, n'est-ce pas?
zoul
@zoul Je ne pense pas, mais ne me citez pas là-dessus car cela fait un moment que j'ai utilisé SVN
Abe Voelker
malheureusement, il ne touche pas les fichiers non suivis. essayez svn revert -R your_local_svn_dir_path
Znik
7

Supprimez les fichiers non versionnés et annulez les modifications:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

En dehors:

D         D:\tmp\sql\update\abc.txt
Denny Weinberg
la source
1
c'est la meilleure réponse, sans script supplémentaire. c'est universel et compatible avec de nombreuses versions de svn.
Znik
3

Solution pure Windows cmd / bat:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
Andriy F.
la source
2

Supprimer la copie de travail du système d'exploitation et la récupérer à nouveau est le plus simple, mais évidemment pas une seule commande.


la source
Péniblement lent. C'est pourquoi je cherchais un moyen de contourner cela.
zoul
1
+1, C'est souvent le seul moyen de résoudre des problèmes étranges, du moins que j'ai trouvés.
Brad
2

Très rapide et simple et fait exactement ce que vous voulez

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

Le /(config|.ini)/ est pour mes propres besoins.

Et peut-être une bonne idée d'ajouter --no-ignore à la commande svn

user1299374
la source
2
C'est tellement horrible. Qu'en est-il des utilisateurs Windows? Subversion a évidemment besoin d'un peu de travail avant de pouvoir être pris au sérieux en tant qu'outil de contrôle de version.
Warren P
1

Pour supprimer les fichiers non suivis

J'ai pu lister tous les fichiers non suivis signalés par svn stdans bash en faisant:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Si vous vous sentez chanceux, vous pouvez remplacer echopar rmpour supprimer les fichiers non suivis. Ou copiez les fichiers que vous souhaitez supprimer à la main, si vous vous sentez moins chanceux.


(J'ai utilisé la réponse de @ abe-voelker pour rétablir les fichiers restants: https://stackoverflow.com/a/6204601/1695680 )

ThorSummoner
la source