web-dev-qa-db-fra.com

Comment puis-je supprimer tous les fichiers / dossiers non versionnés / ignorés dans ma copie de travail?

Si j'ai une copie de travail d'un référentiel Subversion, existe-t-il un moyen de supprimer tous les fichiers non versionnés ou ignorés de cette copie de travail avec une seule commande ou un seul outil? Essentiellement, je cherche l'analogue SVN à git clean .

Une ligne de commande ou une solution graphique (pour TortoiseSVN) serait acceptable.

130
Nick Meyer

Utiliser TortoiseSVN:

96
Stefan
svn status --no-ignore | grep '^[I?]' | cut -c 9- | while IFS= read -r f; do rm -rf "$f"; done

Cela a les caractéristiques suivantes:

  • Les fichiers ignorés et non suivis sont supprimés
  • Cela fonctionne même si un nom de fichier contient des espaces (à l'exception de newline, mais rien ne peut être fait d'autre que d'utiliser le --xml option et analyser la sortie XML résultante)
  • Cela fonctionne même si svn status affiche les autres caractères d'état avant le nom du fichier (ce qui ne devrait pas être le cas, car les fichiers ne sont pas suivis, mais juste au cas où ...)
  • Cela devrait fonctionner sur tout système compatible POSIX

J'utilise un script Shell nommé svnclean qui contient les éléments suivants:

#!/bin/sh

# make sure this script exits with a non-zero return value if the
# current directory is not in a svn working directory
svn info >/dev/null || exit 1

svn status --no-ignore | grep '^[I?]' | cut -c 9- |
# setting IFS to the empty string ensures that any leading or
# trailing whitespace is not trimmed from the filename
while IFS= read -r f; do
    # tell the user which file is being deleted.  use printf
    # instead of echo because different implementations of echo do
    # different things if the arguments begin with hyphens or
    # contain backslashes; the behavior of printf is consistent
    printf '%s\n' "Deleting ${f}..."
    # if rm -rf can't delete the file, something is wrong so bail
    rm -rf "${f}" || exit 1
done
129
Richard Hansen

Je sais que c'est vieux, mais au cas où quelqu'un d'autre tomberait dessus, les nouvelles versions (1.9 ou ultérieures) de svn support --remove-unversioned, par exemple. svn cleanup . --remove-unversioned.

https://Subversion.Apache.org/docs/release-notes/1.9.html#svn-cleanup-options

104
Neil

Cet oneliner pourrait vous aider:

$ svn status | grep '^?' | awk '{print $2}' | xargs rm -rf

A utiliser avec précaution!

40
jkramer

Modification des réponses de Yanal-Yves Fargialla et de gimpf à l’aide de Powershell (sans qu’il soit permis de commenter le message original de Stackoverflow):

powershell -Command "&{(svn status --no-ignore) -match '^[\?i]' -replace '^.\s+' | rm -recurse -force}

Cela ajoute le carat ("^") pour spécifier le début de la ligne, en évitant de faire correspondre tous les fichiers contenant la lettre "i". Ajoutez également les indicateurs pour -recurse et -force à rm afin de rendre cette commande non interactive et donc utilisable dans un script.

14
gwilk

Beaucoup de choses dans SVN peuvent être faites de différentes manières, comme en témoignent les réponses variées en ligne de commande données ici. Avec l'avènement de la version 1.7, TortoiseSVN propose une autre technique offrant une résolution de grain plus fine que celle fournie par Stefan, vous permettant de sélectionner des fichiers non versionnés séparément des fichiers ignorés. Il suffit de sélectionner TortoiseSvn >> Clean up... pour ouvrir cette boîte de dialogue.

TortoiseSVN cleanup options

7
Michael Sorens

Avec Powershell:

(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm

En ligne de commande:

powershell -Command "&{(svn status --no-ignore) -match '[?]' -replace '^.\s+' | rm}"
7

Cet outil fonctionne pour moi (d'après la réponse de Richard Hansen, qui étonnamment ne fonctionnait pas pour les fichiers contenant des espaces):

svn status --no-ignore | grep '^[I?]' | cut -c 9- | xargs -d"\n" -I{} rm {}
6
Dennis Golomazov

Utiliser TortoiseSVN:

  1. Faites un clic droit sur la racine de la copie de travail et sélectionnez TortoiseSVN -> "vérifier les modifications"
  2. Sélectionnez "Afficher les fichiers ignorés"
  3. Trier par colonne "Statut du texte"
  4. faites défiler jusqu'aux fichiers "non versionnés", tous regroupés maintenant; sélectionnez-les tous et faites un clic droit -> supprimer
  5. faites défiler jusqu'aux fichiers "ignorés", maintenant tous regroupés; sélectionnez-les tous et faites un clic droit -> supprimer

Pas vraiment une solution agréable et propre, mais le moyen le plus rapide que je connaisse (sous Windows).

Merci à pkh pour la pointe avec les fichiers ignorés.

5
Thomas Lötzer

Quelqu'un a dit que vous ne pouvez pas le faire à partir de la ligne de commande Windows.

Taureau.

for /f "tokens=2 delims= " %I IN ('svn st --no-ignore ^| findstr /R "^[I?]"') DO (DEL /S /F /Q /A:H "%I" & rmdir /S /Q "%I")

Le fait en une ligne et ne nécessite pas un seul outil GNU outil. :)

4
ChokesMcGee

Ceci est similaire aux autres réponses, mais obtient en fait des fichiers ignorés (notez le 'I' dans les RE):

 rm -rf `svn status --no-ignore | grep '^[\?I]' | sed 's/^[\?I]//'`
4
pkh

vous ne pouvez pas les supprimer avec juste la ligne de commande SVN (vous n'êtes pas sûr des outils de l'interface graphique) si vous êtes sous le système Linux, ceci pourrait vous aider:

http://www.guyrutenberg.com/2008/01/18/delete-unversenced-files-under-svn/

L'autre méthode (brutale) consiste à valider les modifications, à tout supprimer du dossier et à effectuer une nouvelle extraction.

1
Juriy