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


136

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 recherche l'analogue SVN git clean.

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


Réponses:


98

Utilisation de TortoiseSVN:


7
Belle fonctionnalité! J'ai dû lire le lien, cependant, pour découvrir qu'il ne fonctionne que sur la vue liste (pas l'arborescence) sur XP - peut-être devriez-vous l'inclure dans votre réponse.
Nick Meyer

5
La version en ligne de commande de svn (en particulier sous Windows) ne fournit-elle pas la même fonction?
blong

3
Comme sombody l'a souligné ci-dessous:svn cleanup --remove-unversioned --remove-ignored .
haui

133
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 un nom de fichier contient des espaces (sauf pour le saut de ligne, mais il n'y a pas grand-chose à faire à ce sujet à part utiliser l' --xmloption et analyser la sortie xml résultante)
  • Cela fonctionne même si svn statusimprime d'autres caractères d'état avant le nom du fichier (ce qui ne devrait pas parce que les fichiers ne sont pas suivis, mais juste au cas où ...)
  • Il devrait fonctionner sur n'importe quel système compatible POSIX

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

2
Exactement ce que je cherchais, fonctionne comme un charme aussi sur Linux et MacOS!
riche

Avez-vous besoin de réinitialiser l'IFS? J'ai choisi de ne pas créer de script «svnclean». donc je me demande si cela va bousiller IFS pour le reste du script ...
C. Tewalt

3
@matrixugly: Non, vous n'avez pas besoin de IFSrevenir à ce que c'était avant. Lorsque vous le faites VARNAME=value command, l'attribution de valueà VARNAMEs'applique uniquement pendant l'exécution de command(à quelques exceptions près qui ne s'appliquent pas à read). Voir la spécification POSIX et ce rapport de bogue POSIX pour plus de détails.
Richard Hansen

@rich, merci de partager ça. Je suis venu à la recherche d'une solution de nettoyage svn il y a quelques années, et je suis également parti avec des connaissances en script shell! Évidemment, je reviens un peu sur cette réponse.
C. Tewalt

120

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

https://subversion.apache.org/docs/release-notes/1.9.html#svn-cleanup-options


18
Pour moi, c'est la bonne réponse. C'est une réponse en ligne de commande multiplateforme. En outre, vous pouvez supprimer les fichiers ignorés avecsvn cleanup . --remove-ignored
Dan Atkinson

1
Fonctionne avec svn 1.6 et plus.
wegry

2
Veuillez changer cela en 1.9, voir aussi subversion.apache.org/docs/release-notes/1.9.html (j'ai essayé localement et cela n'a pas fonctionné, et je suis sur 1.8.8)
ikku100

2
Il semble que le problème soit qu'il ne supprime pas les dossiers non versionnés .
Nyerguds

1
@Nyerguds: C'est vrai, cela ne supprime pas les dossiers sans version, mais uniquement les fichiers sans version. Est-ce que quelqu'un a trouvé une solution?
dhiraj suvarna

42

Cet oneliner pourrait vous aider:

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

Utilisez avec précaution!


13
cela ne supprime pas les fichiers ignorés et se cassera si un nom de fichier contient des espaces
Richard Hansen

1
Il ne supprime pas non plus les fichiers ignorés
plaisthos

4
Vous pouvez utiliser svn status --no-ignorepour capturer les fichiers ignorés un puits.
Codure le

3
En fait, je considère que c'est une fonctionnalité de laisser en place les fichiers ignorés, facultativement.
macetw

15

Modifier les réponses de Yanal-Yves Fargialla et gimpf à l'aide de Powershell (mais ne pas être autorisé à commenter le message original de Stackoverflow):

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

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


La commande a besoin d'un guillemet double supplémentaire à la fin. Je voudrais juste l'ajouter, mais les modifications doivent être au moins six caractères apparemment.
Ian Miller

7

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, il existe une autre technique pour TortoiseSVN qui, en fait, fournit une résolution plus fine que la réponse de Stefan fournie, vous permettant de sélectionner les fichiers non versionnés séparément des fichiers ignorés. Sélectionnez simplement TortoiseSvn >> Clean up...pour ouvrir cette boîte de dialogue.

Options de nettoyage de TortoiseSVN


7

Avec PowerShell:

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

Depuis la ligne de commande:

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

3
J'adore ce pur script Windows! Je recommanderais d'utiliser à la -match '[\?i]' -replace '^.{8}'place, qui fonctionne correctement même si un nom de fichier commence par un espace et supprime également les fichiers ignorés.
gimpf

1
L'utilisation du tweak suggéré par gimpf fonctionne bien, mais j'ai rencontré un cas où j'ai rencontré une exception ItemNotFoundException. Il s'avère qu'il n'y avait qu'un seul fichier dans le jeu de résultats svn status. Ce tweak résout ce problème: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm ». Compris avec l'aide de ce post
dirtybird

1
et comme cela vous demandera des répertoires qui ne sont pas dans svn (puisque recurse n'a pas été spécifié), ce n'est pas bon pour une utilisation dans un script. Utilisation:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Cet oneliner fonctionne pour moi (basé sur la réponse de Richard Hansen, qui, étonnamment, n'a pas fonctionné pour les fichiers contenant des espaces):

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

2
pour supprimer également les dossiers non versionnés, ajoutez -frà la rmcommande: svn status --no-ignore | grep '^ [I?]' | couper -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

Utilisation de 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 "État du texte"
  4. faites défiler jusqu'aux fichiers "non versionnés", maintenant tous regroupés; 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 le conseil avec les fichiers ignorés.


Je pense que cela supprimera uniquement les fichiers non versionnés. Les éléments ignorés ne seront pas affectés.
Dirk Vollmar

2
Vous n'avez pas besoin d'utiliser la boîte de dialogue de validation et vous pouvez obtenir des fichiers ignorés: Cliquez avec le bouton droit | TortoiseSVN | Vérifiez les modifications. Ensuite, vous pouvez cliquer sur «Afficher les fichiers ignorés» et trier / supprimer de manière appropriée.
pkh

4

Ceci est similaire à d'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]//'`

1
cela casse si un nom de fichier contient des espaces
Richard Hansen

4

Quelqu'un a dit que vous ne pouviez 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-il en une seule ligne et ne nécessite pas un seul outil GNU. :)


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")
Darien Pardinas

@DarienPardinas, votre version est particulièrement utile si vous vous connectez à une commande Jenkins "Execute Windows batch command", que je viens d'apprendre n'est pas une invite de commande mais plutôt un script batch, d'où la nécessité de %%sur%
jxramos

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.