Czy istnieje polecenie Subversion, aby zresetować kopię roboczą?

110

Czy istnieje jedno polecenie Subversion, które „zresetuje” kopię roboczą dokładnie do stanu, który jest przechowywany w repozytorium? Coś w rodzaju git reset --hardlub (ha, twardy reset Gita nie usuwa również niewersjonowanych plików!) rm -rf wc && svn co <url> wc.

Aktualizacja: nie szukam prostego przywrócenia, ponieważ nie usuwa to dodatkowych plików w kopii roboczej. Naprawdę chcę czegoś, co byłoby tym samym, co usunięcie kopii roboczej i ponowne sprawdzenie, tylko bez konieczności ponownego pobierania danych. (Oczywiście nie mam nic przeciwko utracie wszystkich niezatwierdzonych zmian.)

zoul
źródło
cofnąć wszystkie zmiany w kopii roboczej?
mauris
5
Używałbyś git clean -xdfdo usuwania rzeczy, które nie są pod kontrolą źródła.
vcsjones
1
@vcsjones: Dzięki, strona podręcznika zawierająca git cleancytaty dokładnie tego, czego szukam: „Można tego użyć (prawdopodobnie w połączeniu z resetem git) do stworzenia nieskazitelnego katalogu roboczego w celu przetestowania czystej kompilacji.” Szkoda, że ​​Subversion nie wydaje się mieć czegoś takiego wbudowanego.
zoul

Odpowiedzi:

180

Możesz rekurencyjnie przywrócić w ten sposób:

svn revert --recursive .

Nie ma sposobu (bez napisania skryptu kreatywnego), aby usunąć rzeczy, które nie są pod kontrolą źródła. Myślę, że najbliższe co możesz zrobić, to powtórzyć wszystkie pliki, użyć, a następnie grep wyniku svn list, a jeśli grep się nie powiedzie, usuń go.

EDYTUJ : Rozwiązanie dla skryptu kreacji jest tutaj: Automatyczne usuwanie niewersjonowanych plików Subversion

Możesz więc stworzyć skrypt łączący revertdowolną odpowiedź w połączonym pytaniu, która najbardziej Ci odpowiada.

vcsjones
źródło
3
Możesz też svn cleanupnajpierw pobiegać po toalecie. To jest moja standardowa praktyka czyszczenia po przerwanych scaleniach i tak dalej.
Mike Miller
żółw ma również opcję "usuń niewersjonowane pliki" w oknie czyszczenia.
v.oddou,
2
Byłoby miło, gdyby opcja „usuń niewersjonowane pliki” była dostępna z linii poleceń. Szczególnie w przypadku kompilacji automatycznych.
C. Tewalt
3
Zobacz moją odpowiedź ... --remove-niewersjonowany istnieje svn cleanup
Denny Weinberg
38

Aby przywrócić śledzone pliki

svn revert . -R

Aby wyczyścić nieśledzone pliki

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Na początku -rfmoże / powinno wyglądać przerażająco, ale raz zrozumiane, nie będzie z tych powodów:

  1. Tylko całkowicie nieśledzone katalogi będą pasować do przekazanego wzorca rm
  2. -rfJest wymagane, w przeciwnym wypadku te katalogi nie zostaną usunięte

Aby przywrócić, a następnie wyczyścić (pytanie OP)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

Dla stałej łatwości użytkowania

Dodaj stały alias do swoich .bash_aliases

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'
niklauzg
źródło
Drugi fragment wydaje mi się nie działać:awk: fatal: error reading input file '-': Input/output error
hbogert
Musiałem uciec ?w awkpoleceniu, w przeciwnym razie dopasowało wszystkie linie w wyjściusvn status
gpanders
23

Usuń wszystko z lokalnej kopii za pomocą:

rm -r your_local_svn_dir_path/*

I przywróć wszystko rekurencyjnie za pomocą poniższego polecenia.

svn revert -R your_local_svn_dir_path

Jest to znacznie szybsze niż usuwanie całego katalogu, a następnie ponowne pobieranie, ponieważ pliki są przywracane z lokalnych metadanych SVN. Nie potrzebuje nawet połączenia sieciowego.

Vivek Yadav
źródło
4
znacznie szybsze jest czyszczenie svn --remove-unversioned.
Znik
7
svn revert . -R

aby zresetować wszystko.

svn revert path/to/file

dla jednego pliku

Abe Voelker
źródło
1
To nie usuwa dodatkowych niewersjonowanych plików z kopii roboczej, prawda?
zoul
@zoul Nie sądzę, ale nie cytuj mnie na ten temat, ponieważ minęło trochę czasu, odkąd użyłem SVN
Abe Voelker
niestety nie dotyka nie śledzonych plików. try svn revert -R your_local_svn_dir_path
Znik
7

Usuń niewersjonowane pliki i cofnij wszelkie zmiany:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

Na zewnątrz:

D         D:\tmp\sql\update\abc.txt
Denny Weinberg
źródło
1
to najlepsza odpowiedź, bez dodatkowego skryptowania. jest to uniwersalne i kompatybilne z wieloma wersjami svn.
Znik
3

Czyste rozwiązanie cmd / bat w systemie Windows:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof
Andriy F.
źródło
2

Usuń kopię roboczą z systemu operacyjnego i sprawdź ją ponownie jest najprostsze, ale oczywiście nie jest jednym poleceniem.


źródło
Boleśnie wolno. Dlatego szukałem sposobu na obejście tego.
zoul
1
+1, To często jedyny sposób na naprawienie dziwnych problemów, przynajmniej takie, które znalazłem.
Brad,
2

Bardzo szybki i prosty, robi dokładnie to, co chcesz

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

Plik /(config|.ini)/ jest przeznaczony do moich własnych celów.

Dobrym pomysłem może być dodanie --no-ignore do polecenia svn

user1299374
źródło
2
To jest straszne. A co z użytkownikami systemu Windows? Subversion oczywiście wymaga trochę pracy, zanim będzie można go traktować poważnie jako narzędzie do kontroli wersji.
Warren P
1

Aby usunąć nieśledzone pliki

Udało mi się wyświetlić listę wszystkich nieśledzonych plików zgłoszonych przez svn stbash, wykonując:

echo $(svn st | grep -P "^\?" | cut -c 9-)

Jeśli masz szczęście, możesz zastąpić echoje, rmaby usunąć niezatwierdzone pliki. Lub skopiuj pliki, które chcesz usunąć ręcznie, jeśli czujesz się mniej szczęśliwy.


(Użyłem odpowiedzi @ abe-voelker, aby przywrócić pozostałe pliki: https://stackoverflow.com/a/6204601/1695680 )

ThorSummoner
źródło