2009-08-20 9 views
2

En bref, une erreur a été commise et maintenant j'ai au moins une centaine de fichiers dans des dizaines de dossiers qui doivent être retirés de mon dépôt.SVN: définir tous les fichiers marqués d'un "!" à "D"?

À l'heure actuelle, ils sont tous marqués comme "!" dans svn statut et je voudrais les supprimer sans taper manuellement svn supprimer blahblah.

Existe-t-il un moyen rapide de faire cela?

+0

Windows? Linux? – RedFilter

+0

Ah, désolé. C'est OSX, mais la réponse ci-dessous a fonctionné. –

+0

Les applications ne devraient pas permettre aux humains de multiplier leurs erreurs par 10000: P Oh, les horreurs que j'ai eues quand je pensais qu'un rapide "tout remplacer" résoudrait mes problèmes de refactorisation :) – cwap

Répondre

5

C'est assez facile à faire avec un peu de shell-scripting-foo.

svn status | grep "^\!" | awk '{print $2}' | xargs svn del 

Voici une panne, comme l'a demandé:

  • La sortie de svn status canalisée vers grep tuyaux chaque ligne
  • grep qui commence par un ! (Le ^ dans un regex signifie début de la ligne , et le '\' est nécessaire pour échapper à la signification spéciale de !)
  • awk puis prend le second "argument" (donc de parler .. tel est le chemin du fichier) de grep et tuyaux seulement à ...
  • xargs qui est simplement un utilitaire pour la construction d'une exécution des commandes de shell à partir de l'entrée standard, ce qui génère et exécute la commande svn del your/file/here

Vous pouvez également utiliser des variations sur cette ligne pour faire toutes sortes de choses à portée de main avec svn, comme récursive l'ajout de fichiers au repo:

svn status | grep "^\?" | awk '{print $2}' | xargs svn add 

aussi, je viens de me rappeler, et je voulais souligner que cette ne fonctionnera pas si vous avez des espaces dans votre pat h ou noms de fichiers. J'oublie toujours cela, parce que je ne le fais jamais. Si vous avez des espaces dans vos chemins/noms de fichiers, utilisez la variation suivante sur le premier exemple:

svn status | grep "^\!" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn del 

(Il y a probablement une façon de faire plus gracieux que, alors ne hésitez pas à sonner dans). Dans celui-ci, le premier sed prend le premier caractère d'espace, et tout (le cas échéant) les espaces qui le suivent, et les supprime (essentiellement une garniture). Ensuite, le deuxième appel à sed remplace tous les espaces restants par \, qui est un espace échappé, en ce qui concerne le shell. En y repensant, vous pourriez probablement l'envelopper de citations ...

+0

Si vous ne voulez pas supprimer le fichier localement , n'oublie pas l'argument --keep-local. – RedFilter

+0

Merci. Je suis encore un peu nouveau dans le shell, donc je veux être sûr de comprendre ce que fait cette ligne. La sortie de svn status est utilisée comme un fichier pour grep, qui recherche! (qu'est-ce que le^fait?). Je suppose que $ 2 fait référence au deuxième groupe de caractères non-blancs qui est mis en svn del? Est-ce exact? –

+0

Ya, ça sonne bien. "^" correspond au début de la ligne et différencie les chaînes comme ".....! ..." et "! ......" –

Questions connexes