133 votes

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 dépôt Subversion, y a-t-il un moyen de supprimer tous les fichiers non versionnés ou ignorés dans cette copie de travail avec une seule commande ou un seul outil ? Essentiellement, je cherche l'analogue de SVN à git clean .

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

133voto

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

Il présente les caractéristiques suivantes :

  • Les fichiers ignorés et non suivis sont supprimés.
  • Cela fonctionne même si le nom d'un fichier contient des espaces (à l'exception de la nouvelle ligne, mais il n'y a pas grand-chose à faire à ce sujet, à part utiliser l'attribut --xml et analyser la sortie xml qui en résulte)
  • Cela fonctionne même si svn status imprime d'autres caractères d'état avant le nom du fichier (ce qui ne devrait pas être le cas puisque les fichiers ne sont pas suivis, mais juste au cas où...)
  • Il devrait fonctionner sur tout système compatible POSIX.

J'utilise un shell script 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

97voto

Stefan Points 29091

Utilisation de TortoiseSVN :

41voto

jkramer Points 7271

Cet oneliner pourrait vous aider :

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

A utiliser avec précaution !

15voto

gwilk Points 81

Modifier les réponses de Yanal-Yves Fargialla et de gimpf en utilisant Powershell (mais sans être autorisé à 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 qui contiennent la lettre "i". Ajoutez également les drapeaux -recurse et -force à rm pour rendre cette commande non interactive et donc utilisable dans un script.

7voto

Michael Sorens Points 9637

Beaucoup de choses dans SVN peuvent être faites de différentes manières, comme le prouvent les diverses réponses en ligne de commande données ici. Avec l'avènement de la version 1.7, il y a encore une autre technique pour TortoiseSVN qui, en fait, fournit une résolution plus fine que la réponse de Stefan, vous permettant de sélectionner les fichiers non-versé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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X