Wie kann ich alle nicht versionierten / ignorierten Dateien / Ordner in meiner Arbeitskopie löschen?


136

Wenn ich eine Arbeitskopie eines Subversion-Repositorys habe, gibt es eine Möglichkeit, alle nicht versionierten oder ignorierten Dateien in dieser Arbeitskopie mit einem einzigen Befehl oder Tool zu löschen? Im Wesentlichen suche ich das SVN-Analogon zu git clean.

Entweder eine Befehlszeile oder eine GUI-Lösung (für TortoiseSVN) wäre akzeptabel.


Antworten:


98

Verwenden von TortoiseSVN:


7
Nettes Feature! Ich musste den Link jedoch lesen, um herauszufinden, dass er nur in der Listenansicht (nicht in der Baumansicht) unter XP funktioniert - vielleicht sollten Sie das in Ihre Antwort aufnehmen.
Nick Meyer

5
Bietet die Befehlszeilenversion von svn (speziell unter Windows) nicht dieselbe Funktion?
Blong

3
Wie jemand unten svn cleanup --remove-unversioned --remove-ignored .
betonte

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

Dies hat die folgenden Funktionen:

  • Sowohl ignorierte als auch nicht verfolgte Dateien werden gelöscht
  • Es funktioniert auch dann, wenn ein Dateiname Leerzeichen enthält (außer Newline, aber es kann nicht viel dagegen getan werden, außer die --xmlOption zu verwenden und die resultierende XML-Ausgabe zu analysieren).
  • Es funktioniert auch, wenn svn statusandere Statuszeichen vor dem Dateinamen gedruckt werden (was nicht der Fall sein sollte, da die Dateien nicht verfolgt werden, sondern nur für den Fall ...).
  • Es sollte auf jedem POSIX-kompatiblen System funktionieren

Ich verwende ein Shell-Skript mit dem Namen svnclean, das Folgendes enthält:

#!/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
Genau das, wonach ich gesucht habe, funktioniert auch unter Linux und MacOS wie ein Zauber!
Reich

Müssen Sie das IFS zurücksetzen? Ich habe mich entschieden, kein 'svnclean'-Skript zu erstellen. Ich frage mich also, ob das IFS für den Rest des Skripts
vermasseln wird

3
@matrixugly: Nein, du musst nicht zu dem IFSzurückkehren, was es vorher war. Wenn Sie das tun VARNAME=value command, die Zuordnung valuezu VARNAMEgilt nur während der Ausführung command(mit einigen Ausnahmen , die gelten nicht für read). Weitere Informationen finden Sie in der POSIX-Spezifikation und in diesem POSIX-Fehlerbericht .
Richard Hansen

@rich, danke für das Teilen. Kam vor ein paar Jahren auf der Suche nach einer SVN-Bereinigungslösung und ging auch mit etwas Shell-Scripting-Wissen davon! Offensichtlich bin ich ziemlich oft auf diese Antwort zurückgekommen.
C. Tewalt

120

Ich weiß, dass dies alt ist, aber falls jemand anderes darauf stößt, neuere Versionen (1.9 oder höher) der SVN-Unterstützung --remove-unversioned, z svn cleanup . --remove-unversioned.

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


18
Für mich ist das die richtige Antwort. Es ist eine plattformübergreifende Befehlszeilenantwort. Sie können auch ignorierte Dateien mitsvn cleanup . --remove-ignored
Dan Atkinson

1
Funktioniert in SVN 1.6 und höher.
Wegry

2
Bitte ändern Sie das in 1.9, siehe auch subversion.apache.org/docs/release-notes/1.9.html (Ich habe es lokal versucht und es hat nicht funktioniert, und ich bin auf 1.8.8)
ikku100

2
Das Problem scheint zu sein, dass nicht versionierte Ordner nicht entfernt werden .
Nyerguds

1
@Nyerguds: Richtig, dies löscht keine nicht versionierten Ordner, sondern nur nicht versionierte Dateien. Hat jemand eine Lösung gefunden?
Dhiraj Suvarna

41

Dieser Oneliner könnte Ihnen helfen:

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

Vorsichtig verwenden!


13
Dies entfernt keine ignorierten Dateien und wird
Richard Hansen

1
Ignorierte Dateien werden auch nicht gelöscht
plaisthos

4
Sie können verwenden svn status --no-ignore, um die ignorierten Dateien gut zu erfassen.
Codure

3
Tatsächlich halte ich es für eine Funktion, die ignorierten Dateien optional an Ort und Stelle zu lassen.
Macetw

15

Ändern der Antworten von Yanal-Yves Fargialla und gimpf mithilfe von Powershell (darf jedoch den ursprünglichen Beitrag von Stackoverflow nicht kommentieren):

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

Dies fügt das Karat ("^") hinzu, um den Zeilenanfang anzugeben, wodurch vermieden wird, dass alle Dateien übereinstimmen, die den Buchstaben "i" enthalten. Fügen Sie außerdem die Flags für -recurse und -force zu rm hinzu, um diesen Befehl nicht interaktiv und somit in einem Skript verwendbar zu machen.


Der Befehl benötigt am Ende ein zusätzliches Anführungszeichen. Ich würde es nur hinzufügen, aber die Bearbeitungen müssen anscheinend mindestens sechs Zeichen umfassen.
Ian Miller

7

Viele Dinge in SVN können auf unterschiedliche Weise ausgeführt werden, wie die hier angegebenen unterschiedlichen Befehlszeilenantworten belegen. Mit dem Aufkommen von Version 1.7 gibt es für TortoiseSVN eine weitere Technik, die tatsächlich eine feinere Kornauflösung bietet als Stefans Antwort, sodass Sie nicht versionierte Dateien getrennt von ignorierten Dateien auswählen können. Wählen Sie einfach, TortoiseSvn >> Clean up...um diesen Dialog zu öffnen.

Bereinigungsoptionen für TortoiseSVN


7

Mit Powershell:

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

Über die Befehlszeile:

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

3
Ich liebe dieses reine Windows-Skript! Ich würde empfehlen, -match '[\?i]' -replace '^.{8}'stattdessen zu verwenden, was auch dann richtig funktioniert, wenn ein Dateiname mit einem Leerzeichen beginnt und auch die ignorierten Dateien löscht.
Gimpf

1
Die Verwendung der von gimpf vorgeschlagenen Optimierung funktioniert gut, aber ich bin auf einen Fall gestoßen, in dem ich auf eine ItemNotFoundException gestoßen bin. Es stellte sich heraus, dass die Ergebnismenge des SVN-Status nur eine einzige Datei enthielt. Diese Optimierung behebt das Problem: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm `. Ich habe es mit Hilfe dieses Beitrags herausgefunden
Dirtybird

1
und da dies Sie zur Eingabe von Verzeichnissen auffordert, die nicht in svn enthalten sind (da recurse nicht angegeben wurde), ist es nicht gut für die Verwendung in einem Skript. Verwenden Sie:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Dieser Oneliner funktioniert für mich (basierend auf Richard Hansens Antwort, die überraschenderweise bei Dateien mit Leerzeichen nicht funktioniert hat):

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

2
Um auch nicht versionierte Ordner zu löschen, fügen Sie -frden folgenden rmBefehl hinzu: svn status --no-ignore | grep '^ [I?]' | Schnitt -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

Verwenden von TortoiseSVN:

  1. Klicken Sie mit der rechten Maustaste auf das Stammverzeichnis der Arbeitskopie und wählen Sie TortoiseSVN -> "Nach Änderungen suchen".
  2. Wählen Sie "Ignorierte Dateien anzeigen".
  3. Sortieren nach Spalte "Textstatus"
  4. Scrollen Sie zu den "nicht versionierten" Dateien, die jetzt alle zusammen gruppiert sind. Wählen Sie alle aus und klicken Sie mit der rechten Maustaste -> Löschen
  5. Scrollen Sie zu den "ignorierten" Dateien, die jetzt alle zusammengefasst sind. Wählen Sie alle aus und klicken Sie mit der rechten Maustaste -> Löschen

Keine wirklich schöne und saubere Lösung, aber der schnellste Weg, den ich kenne (unter Windows).

Danke an pkh für den Tipp mit den ignorierten Dateien.


Ich glaube, dies wird nur nicht versionierte Dateien entfernen. Ignorierte Elemente sind nicht betroffen.
Dirk Vollmar

2
Sie müssen den Commit-Dialog nicht verwenden, und Sie können ignorierte Dateien erhalten: Klicken Sie mit der rechten Maustaste auf | TortoiseSVN | Auf Änderungen prüfen. Dann können Sie auf "Ignorierte Dateien anzeigen" klicken und entsprechend sortieren / löschen.
pkh

4

Dies ähnelt anderen Antworten, wird jedoch tatsächlich ignoriert (beachten Sie das 'I' in den REs):

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

1
Dies bricht ab, wenn ein Dateiname Leerzeichen enthält
Richard Hansen

4

Jemand sagte, Sie können dies nicht über die Windows-Befehlszeile tun.

Stier.

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

Funktioniert in einer Zeile und erfordert kein einziges GNU-Tool. :) :)


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, ist Ihre Version besonders nützlich , wenn in einem Jenkins Aufstecken „Befehl Windows - Batch - Execute“, die ich gerade gelernt haben , ist nicht eine Eingabeaufforderung , sondern eher wie ein Batch - Skript, daher die Notwendigkeit , %%über%
jxramos

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.