SVN, aby usunąć wszystkie lokalnie brakujące pliki

136

Czy w SVN jest polecenie, którego mogę użyć, aby usunąć wszystkie lokalnie brakujące pliki w katalogu?

Lub jeśli to się nie uda, w jakiś sposób wyszczególni się tylko te pliki, których brakuje (lub, w bardziej ogólnym przypadku, mają status A, D,? Itd.)

wheresrhys
źródło
1
Utrzymuję 1 folder roboczy i 1 folder do pobrania. I przenieś tylko pliki z folderu roboczego do folderu wyewidencjonowania. Jeśli folder musi zostać dodany / usunięty, robię to ręcznie, a następnie przenoszę pliki do tego folderu (na przykład nowe pakiety, stare pakiety). Większość problemów z svn występuje podczas przenoszenia folderów na kopii roboczej. Nawet podczas kopiowania plików z kopii roboczej do kopii do pobrania należy przenosić tylko pliki, a nie foldery.
Siddharth

Odpowiedzi:

99

Jeśli używasz TortoiseSVN, po prostu zrób Sprawdź zmiany , posortuj według kolumny Stan , wybierz wszystkie zaznaczone wpisy missing, kliknij prawym przyciskiem myszy, aby otworzyć menu kontekstowe i wybierz Usuń . Na koniec zobowiąż się do opublikowania zmian w repozytorium.

Jeśli korzystasz z systemu Windows, ale wolisz wiersz poleceń i lubisz bawić się w PowerShell, ta jedna linijka załatwi sprawę:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Oznacza to, że filtruj dane wyjściowe tylko do tych wierszy, które pokazują brakujące pliki (oznaczone wykrzyknikiem na początku wiersza), przechwytuj skojarzoną nazwę pliku i wykonaj operację svn rmna tej nazwie pliku.

(Wpis na blogu Usuń wszystkie „brakujące” pliki z kopii roboczej SVN działa podobnie w systemie Unix / Linux).

Michael Sorens
źródło
czy jest sposób na zaćmienie przy użyciu wtyczki subclipse? tak źle jest zaktualizować, a następnie znaleźć je w projekcie i ponownie usunąć.
Stan
FYI, jeśli potrzebne jest hasło subversion, oto składnia: svn status - nazwa użytkownika nazwa_użytkownika_tutaj --password hasło_tutaj | ? {$ _ -match '^! \ s + (. *)'} | % {svn rm $ Matches [1] --username nazwa_użytkownika_tutaj - hasło hasło_tutaj}
Jeff
czy powinieneś najpierw zatwierdzić po tej linii przed wykonaniem svn up? ponieważ pliki są przywracane z serwera svn
Pierre
Czy ta akcja usunie również pliki z repozytorium?
Sebastián Ulloa
180

Jeśli używasz systemu Mac ( Darwin ) lub Linux, możesz przesłać dane wyjściowe następujących poleceń do svn rmwszystkich brakujących plików. Możesz ustawić bieżący katalog roboczy na odpowiedni katalog lub podkatalog przed ich uruchomieniem - w zależności od tego, czy chcesz uruchomić całą kopię roboczą, czy tylko podzbiór.

  1. Uruchom status svn
  2. Wyszukaj wiersze zaczynające się od „!” (brakujący)
  3. Wydrukuj „--force” (argument svn) i drugą kolumnę (nazwa pliku) wyniku z # 2
  4. Uruchom, svn rmużywając danych wyjściowych # 3 jako argumentów

Więc pełne polecenie to:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

Bibliografia:

Peter Ajtai
źródło
4
To nie działa, jeśli w nazwie pliku są spacje. Jednak nie znam wystarczająco awk, aby to naprawić.
bugloaf
2
Użyj, awk '{print " --force "$2"@"}'jeśli nazwa pliku zawiera @(na przykład, jeśli jesteś programistą iOS)
Guillaume Algis
1
I obsłuż nazwę pliku białymi spacjami, awk '{$1=""; print " --force \""substr($0,2)"@\"" }'powinno załatwić sprawę (i zaczyna wyglądać brzydko)
Guillaume Algis
12
Pełne polecenie zajmujące się spacją to "svn st | grep ^! | Awk '{$ 1 =" "; print" --force \ "" substr ($ 0,2) "@ \" "}' | xargs svn rm "
SmallChess,
3
Dlaczego nie włożysz --forcedo części xargs?
jwg
55
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. Filtruj tylko według brakujących plików
  3. Wytnij wykrzyknik
  4. Odfiltruj końcowe spacje
  5. Dodaj wiodący cytat
  6. Dodaj końcowy cytat
  7. svn remove każdy plik
ivrin
źródło
To rozwiązanie działa, jeśli w plikach / katalogach są spacje.
yuric
Jak dodać do tego gadatliwość? xargs -verbose svn rm?
TekiusFanatikus
1
To tylko wskazówka dla użytkowników skryptów itp., To polecenie nie powiedzie się, jeśli nie zostaną znalezione żadne pliki do usunięcia: svn: E205001: Spróbuj użyć polecenia „svn help delete”, aby uzyskać więcej informacji svn: E205001: podano za mało argumentów
Thorsten Schöning
1
Problem @ ThorstenSchöning można rozwiązać, dodając -rdo xargsopcji (nie uruchamiaj, jeśli nie podano argumentów). Ponadto liczba argumentów powinna być ograniczona, a usunięcia powinny być grupowane, ponieważ wywołanie kończy się niepowodzeniem przy bardzo dużej liczbie plików do usunięcia, np -n 500. I wreszcie, wykonywane cytowanie jest nieoptymalne dla plików zawierających specjalne powłoki, takie jak $- lepiej użyj \njako separatora i pozostaw cytowanie na xargs:svn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
haui
19

Podziękowania dla Paula Martina za wersję Windows.

Tutaj jest niewielka modyfikacja skryptu, więc pliki Windows ze spacjami są również brane pod uwagę. Również missing.listplik zostanie usunięty na końcu.

Zapisałem następujący plik w svndel.bat w moim katalogu bin SVN (ustawionym w moim środowisku %% PATH), aby można go było wywołać z dowolnego folderu w wierszu polecenia.

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL
user3689460
źródło
miło widzieć, że wciąż pojawia się jakiś innowacyjny kod wsadowy :)
user230910
Wow, świetna odpowiedź. Miałem przejść z PowerShell, ale to było o wiele łatwiejsze.
Jim Andrakakis
Dodałem kolejną linię po del missing.list 2>NUL, ponieważ dodałem wszystkie nowe pliki bezpośrednio po pierwszym usunięciu usuniętych plików, więc dodałem missing.listdo svn: svn delete "missing.list"działało dla mnie
Pierre
Zmodyfikowałem ten skrypt, aby spróbować uruchomić go z dowolnej lokalizacji, a następnie napotkałem ten problem stackoverflow.com/questions/1137219/, więc wygląda na to, że MUSISZ użyć bieżącego katalogu roboczego, aby wykonać tę akcję.
aolszowka
7

Podoba mi się opcja PowerShell ... Ale oto inna opcja, jeśli używasz skryptów wsadowych systemu Windows:

svn status | findstr /R "^!" > missing.list
for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
Paul Martin
źródło
5

Alternatywa, która działa w systemie Linux (bash) dla plików do usunięcia, które nie zawierają spacji w ścieżce:

svn usuń `` status svn | grep! | awk '{print $ 2}' ``
gilyen
źródło
5

W rzeczywistości możliwe jest całkowite usunięcie missing.listz user3689460 i Paul Martin

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")
Amfasis
źródło
dla odniesienia - to jest DOS / cmd.exe w systemie Windows Land
user230910
4

Ten skrypt powłoki rekurencyjnie bada ( svn status) katalogi w twoim projekcie, usuwając brakujące pliki (zgodnie z pytaniem) i dodając nowe pliki do repozytorium. Jest to coś w rodzaju „przechowywania w repozytorium aktualnego obrazu projektu”.

if [ $# != 1 ]
then
    echo  "usage: doSVNsnapshot.sh DIR"
    exit 0
fi

ROOT=$1

for i in `find ${ROOT} -type d \! -path "*.svn*" `
do

    echo
    echo "--------------------------"
    ( cd $i ; 
    echo $i
    echo "--------------------------"


    svn status | awk '  
            /^[!]/ { system("svn rm " $2) }
            /^[?]/ { system("svn add " $2) }
        '
    )
    echo

done
cibercitizen1
źródło
4

Niewielka modyfikacja wiersza poleceń, która działa w systemie Mac OS (miejmy nadzieję, że nawet na Linuksie) i radzi sobie z plikami, które zgłasza polecenie „svm sr”, np. „! M” (brakujący i zmodyfikowany).

Radzi sobie ze spacjami w plikach.

Opiera się na modyfikacji poprzedniej odpowiedzi:

svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm
Stefano Bossi
źródło
2

Gdy mamy do czynienia z dużą liczbą plików, może się zdarzyć, że argument wejściowy do xargs staje się zbyt długi. Poszedłem na bardziej naiwną implementację, która działa również w tym przypadku.

To jest dla Linuksa:

#! /bin/bash
# 1. get all statii in the working copy
# 2. filter out only missing files
# 3. cut off the status indicator (!) and only return filepaths
MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
# iterate over filepaths
for MISSING_PATH in $MISSING_PATHS; do
    echo $MISSING_PATH
    svn rm --force "$MISSING_PATH"
done
Jonas Eberle
źródło
1

Poprawiona wersja

Więc pełne polecenie to:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm
Zeta
źródło