Jak mogę usunąć wszystkie niewersjonowane / ignorowane pliki / foldery z mojej kopii roboczej?


136

Jeśli mam kopię roboczą repozytorium Subversion, czy istnieje sposób na usunięcie wszystkich niewersjonowanych lub zignorowanych plików w tej kopii roboczej za pomocą jednego polecenia lub narzędzia? Zasadniczo szukam analogu SVN do git clean.

Albo linia poleceń, albo rozwiązanie GUI (dla TortoiseSVN) byłyby dopuszczalne.


Odpowiedzi:


98

Korzystanie z TortoiseSVN:


7
Niezła funkcja! Musiałem jednak przeczytać link, aby dowiedzieć się, że działa tylko w widoku listy (a nie widoku drzewa) w XP - może powinieneś to uwzględnić w swojej odpowiedzi.
Nick Meyer

5
Czy wersja svn z wiersza poleceń (szczególnie w systemie Windows) nie zapewnia tej samej funkcji?
blong

3
Jak zauważył poniżej: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

Ma to następujące cechy:

  • Pliki ignorowane i nieśledzone są usuwane
  • Działa nawet wtedy, gdy nazwa pliku zawiera spacje (z wyjątkiem znaku nowej linii, ale niewiele można na to poradzić poza skorzystaniem z --xmlopcji i przeanalizowaniem wynikowego wyjścia xml)
  • Działa nawet wtedy, gdy svn statusdrukuje inne znaki statusu przed nazwą pliku (czego nie powinno, ponieważ pliki nie są śledzone, ale na wszelki wypadek ...)
  • Powinien działać na każdym systemie zgodnym z POSIX

Używam skryptu powłoki o nazwie, svncleanktóry zawiera następujące elementy:

#!/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
Dokładnie to, czego szukałem, działa jak urok również na Linuksie i MacOS!
bogaty

Czy musisz zresetować IFS? Zdecydowałem się nie tworzyć scenariusza „svnclean”. więc zastanawiam się, czy to
schrzani

3
@matrixugly: Nie, nie musisz IFSwracać do tego, co było wcześniej. Kiedy to zrobisz VARNAME=value command, przypisanie valuedo VARNAMEma zastosowanie tylko podczas wykonywania command(z pewnymi wyjątkami, które nie mają zastosowania read). Zobacz specyfikację POSIX i ten raport o błędzie POSIX, aby uzyskać więcej informacji.
Richard Hansen,

@rich, dzięki za udostępnienie tego. Szukałem rozwiązania do czyszczenia svn kilka lat temu, a także odszedłem z pewną wiedzą na temat skryptów powłoki! Najwyraźniej dość często wracałem do tej odpowiedzi.
C. Tewalt,

120

Wiem, że to stare, ale na wypadek, gdyby ktoś się na to natknął, nowsze wersje (1.9 lub nowsze) obsługi svn --remove-unversioned, np svn cleanup . --remove-unversioned.

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


18
Dla mnie to właściwa odpowiedź. To odpowiedź wiersza poleceń dla wielu platform. Możesz także usunąć zignorowane pliki za pomocąsvn cleanup . --remove-ignored
Dan Atkinson

1
Działa w svn 1.6 i nowszych.
wegry

2
Zmień to na 1.9, zobacz także subversion.apache.org/docs/release-notes/1.9.html (próbowałem lokalnie i nie zadziałało, jestem na 1.8.8)
ikku100

2
Wygląda na to, że problem polega na tym, że nie usuwa niewersjonowanych folderów .
Nyerguds,

1
@Nyerguds: To prawda, nie usuwa to folderów bez wersji, ale tylko pliki bez wersji. Czy ktoś znalazł rozwiązanie?
dhiraj suvarna

42

Ten oneliner może Ci pomóc:

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

Używaj ostrożnie!


13
nie usunie to ignorowanych plików i zepsuje się, jeśli nazwa pliku zawiera spacje
Richard Hansen

1
Nie usuwa również ignorowanych plików
plaisthos

4
Możesz użyć svn status --no-ignoredo dobrze wychwycenia ignorowanych plików.
Codure

3
W rzeczywistości uważam za funkcję opcjonalne pozostawienie na miejscu ignorowanych plików.
macetw

15

Modyfikowanie odpowiedzi Yanal-Yves Fargialla i gimpf za pomocą Powershell (ale bez możliwości komentowania oryginalnego postu przez Stackoverflow):

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

Dodaje to karat („^”), aby określić początek wiersza, unikając dopasowywania wszystkich plików zawierających literę „i”. Dodaj także flagi -recurse i -force do rm, aby polecenie to stało się nieinteraktywne i możliwe do użycia w skrypcie.


Polecenie wymaga dodatkowego podwójnego cudzysłowu na końcu. Po prostu dodam, ale najwyraźniej zmiany muszą mieć co najmniej sześć znaków.
Ian Miller,

7

Wiele rzeczy w SVN można zrobić na różne sposoby, o czym świadczą różne odpowiedzi wiersza poleceń podane tutaj. Wraz z nadejściem wersji 1.7 istnieje jeszcze jedna technika TortoiseSVN, która w rzeczywistości zapewnia lepszą rozdzielczość ziarna niż ta, którą dostarczyła odpowiedź Stefana, pozwalając na wybieranie niewersjonowanych plików oddzielnie od ignorowanych. Po prostu wybierz, TortoiseSvn >> Clean up...aby otworzyć to okno dialogowe.

Opcje czyszczenia TortoiseSVN


7

Z PowerShell:

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

Z linii poleceń:

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

3
Uwielbiam ten czysty skrypt Windows! Zalecałbym użycie -match '[\?i]' -replace '^.{8}'zamiast tego, który działa poprawnie, nawet jeśli nazwa pliku zaczyna się od spacji, a także usuwa ignorowane pliki.
gimpf

1
Korzystanie z sugerowanych poprawek gimpf działa dobrze, ale napotkałem przypadek, w którym napotkałem wyjątek ItemNotFoundException. Okazuje się, że w zestawie wyników statusu svn był tylko jeden plik. To ulepszenie rozwiązuje ten problem: code@ (svn status --no-ignore) -match '[\? I]' -replace '^. {8}' | rm `. Zrozumiałem to z pomocą tego postu
dirtybird

1
a ponieważ wyświetli monit o katalogi spoza svn (ponieważ recurse nie zostało określone), nie nadaje się do użycia w skrypcie. Użyj:powershell -Command "&{(svn status --no-ignore) -match '[\?i]' -replace '^.{8}' | remove-item -force -recurse}"
thinkOfaNumber

6

Ten oneliner działa dla mnie (na podstawie odpowiedzi Richarda Hansena, która, co zaskakujące, nie działała dla plików zawierających spacje):

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

2
aby usunąć również niewersjonowane foldery, dodaj -frdo rmpolecenia: svn status --no-ignore | grep '^ [I?]' | cut -c 9- | xargs -d "\ n" -I {} rm -fr {}
Dennis Golomazov

5

Korzystanie z TortoiseSVN:

  1. Kliknij prawym przyciskiem myszy katalog główny kopii roboczej i wybierz TortoiseSVN -> "sprawdź zmiany"
  2. Wybierz „Pokaż ignorowane pliki”
  3. Sortuj według kolumny „Stan tekstu”
  4. przewiń do „niewersjonowanych” plików, teraz wszystkie zgrupowane razem; wybierz je wszystkie i kliknij prawym przyciskiem myszy -> usuń
  5. przewiń do „zignorowanych” plików, teraz wszystkie zgrupowane razem; wybierz je wszystkie i kliknij prawym przyciskiem myszy -> usuń

Niezbyt ładne i czyste rozwiązanie, ale najszybszy sposób, jaki znam (w systemie Windows).

Dzięki pkh za wskazówkę dotyczącą ignorowanych plików.


Uważam, że spowoduje to usunięcie tylko plików bez wersji. Ignorowane przedmioty nie zostaną zmienione.
Dirk Vollmar

2
Nie musisz używać okna dialogowego zatwierdzenia, a możesz zignorować pliki: Kliknij prawym przyciskiem myszy | TortoiseSVN | Sprawdź zmiany. Następnie możesz kliknąć „Pokaż ignorowane pliki” i odpowiednio posortować / usunąć.
pkh

4

Jest to podobne do innych odpowiedzi, ale w rzeczywistości pliki są ignorowane (zwróć uwagę na „I” w RE):

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

1
to się psuje, jeśli nazwa pliku zawiera spacje
Richard Hansen,

4

Ktoś powiedział, że nie możesz tego zrobić z wiersza poleceń systemu Windows.

Byk.

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

Robi to w jednej linii i nie wymaga ani jednego narzędzia 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, twoja wersja jest szczególnie przydatna, jeśli podłączasz do Jenkinsa "Wykonaj polecenie wsadowe systemu Windows", którego właśnie się nauczyłem, nie jest %%%
wierszem

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.