Jak mogę usunąć wszystkie moje zmiany z mojego katalogu roboczego SVN?

195

Mam katalog roboczy SVN. Wprowadziłem kilka zmian w tym katalogu i pokazuje się w svn status. Ale czy jest jakiś sposób, aby usunąć wszystkie moje zmiany i po prostu pobrać wszystko z pnia za pomocą wiersza polecenia?

n179911
źródło

Odpowiedzi:

274
svn revert -R .
svn up

Spowoduje to rekurencyjne cofnięcie bieżącego katalogu i wszystkich znajdujących się pod nim katalogów, a następnie zaktualizowanie do najnowszej wersji.

Mike McQuaid
źródło
2
Zauważ, że to nie działa z zewnętrznymi (pozornie są one ignorowane).
cic
86

Użyłem kombinacji odpowiedzi innych ludzi, aby wymyślić to rozwiązanie:

Cofnij normalne lokalne zmiany SVN

svn revert -R .

Usuń wszelkie inne zmiany i obsługuje usuwanie plików / folderów ze spacjami itp.

svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf

Nie zapomnij pobrać najnowszych plików z SVN

svn update --force
Shaize
źródło
Wielkie dzięki Shaize, to jest najbardziej elegancka sed, ... fajka, jaką do tej pory widziałem :) Szczególnie zwracając uwagę na ignorowanie.
tyran
Działa jak marzenie. Dzięki!
Niilo Keinänen
28
svn revert -R .
svn cleanup . --remove-unversioned
lexa-b
źródło
Nie usuwa plików * .class itp.
Trismegistos
2
jeśli chcesz również usunąć zignorowane plikisvn cleanup . --remove-ignored
Kip
14

Jeśli nie masz żadnych zmian, zawsze możesz być naprawdę dokładny i / lub leniwy i zrobić ...

rm -rf *
svn update

Ale tak naprawdę nie rób tego, chyba że jesteś naprawdę pewien, że opcja nuke-from-space jest tym, czego chcesz !! Ma to tę zaletę, że nukuje także wszystkie cruft kompilacji, pliki tymczasowe i rzeczy, które SVN ignoruje.

Bardziej poprawnym rozwiązaniem jest użycie polecenia revert:

svn revert -R .

-R powoduje, że subversion powtarza się i przywraca wszystko w bieżącym katalogu roboczym i poniżej niego.

bbum
źródło
Często korzystałem z tej sztuczki, ale w SVN 1.7, gdzie metadane są przechowywane tylko w katalogu głównym WC, nie jest to już czyste rozwiązanie. Na przykład usunięte pliki pozostają usunięte.
Bart van Heukelom
8
svn nuke-from-space
Jason Swett
9

Żadna z odpowiedzi tutaj nie była tym, czego chciałem. Oto, co wymyśliłem:

# Recursively revert any locally-changed files
svn revert -R .

# Delete any other files in the sandbox (including ignored files),
# being careful to handle files with spaces in the name
svn status --no-ignore | grep '^\?' | \
    perl -ne 'print "$1\n" if $_ =~ /^\S+\s+(.*)$/' | \
    tr '\n' '\0' | xargs -0 rm -rf

Testowane na systemie Linux; może działać w Cygwin, ale opiera się (jak sądzę) na specyficznym dla GNU rozszerzeniu, które pozwala na dzielenie xargs na podstawie '\0'zamiast białych znaków.

Zaletą powyższego polecenia jest to, że resetowanie obszaru izolowanego nie wymaga żadnej aktywności sieciowej. Dostajesz dokładnie to, co miałeś wcześniej i tracisz wszystkie swoje zmiany . (wyłączenie odpowiedzialności, zanim ktoś obwinie mnie za to, że ten kod niszczy ich pracę) ;-)

Używam tego skryptu w systemie ciągłej integracji, w którym chcę mieć pewność, że po uruchomieniu niektórych testów zostanie wykonana czysta kompilacja.

Edycja : Nie jestem pewien, czy to działa ze wszystkimi wersjami Subversion. Nie jest jasne, czy svn statuspolecenie jest zawsze formatowane konsekwentnie. Używaj na własne ryzyko, jak w przypadku każdego polecenia, które używa takiego rmpolecenia zbiorczego .

mpontillo
źródło
7

svn revert cofnie wszelkie dokonane zmiany lokalne

Sean
źródło
5

Aby cofnąć wszystkie zmiany lokalne, możesz użyć następującego polecenia:

svn st -q | awk '{print $2;}' | xargs svn revert
NaN
źródło
Otrzymuję komunikat o błędzie „Za mało argumentów” do przywrócenia svn
okólny
4
svn status | grep '^M' | sed -e 's/^.//' | xargs rm

svn update

Usunie każdy zmodyfikowany plik. Wydaje mi się, że pamiętam problemy z przywracaniem, gdy pliki i katalogi mogły zostać dodane.

Juan
źródło
0

Jeśli korzystasz z systemu Windows, poniższe polecenie pętli przywróci wszystkie niezatwierdzone zmiany wprowadzone w obszarze roboczym:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)

Jeśli chcesz usunąć wszystkie niezatwierdzone zmiany i wszystkie niewersjonowane obiekty, będzie to wymagało 2 pętli:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)
for /F "tokens=1,*" %%d in ('svn st') do (
  svn rm --force "%%e"
)
David
źródło