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?
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?
Odpowiedzi:
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.
Użyłem kombinacji odpowiedzi innych ludzi, aby wymyślić to rozwiązanie:
svn revert -R .
svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf
svn update --force
svn revert -R .
svn cleanup . --remove-unversioned
svn cleanup . --remove-ignored
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.
svn nuke-from-space
Ż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 status
polecenie jest zawsze formatowane konsekwentnie. Używaj na własne ryzyko, jak w przypadku każdego polecenia, które używa takiego rm
polecenia zbiorczego .
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"
)