Czy istnieje sposób na odzyskanie sprawności po przypadkowym „przywróceniu svn”?

95

Udało mi się dziś rano strzelić sobie w stopę, wykonując następujące czynności:

  1. Rozpocząłem pracę nad zmianą w moim projekcie
  2. Wprowadzono kilka zmian w kilku plikach
  3. Zrozumiałem, że moje podejście było błędne i że muszę zacząć od nowa
  4. cd do najwyższego poziomu mojego projektu i wykonałem "svn --recursive revert". aby przywrócić moją lokalną piaskownicę do stanu sprzed zmian.
  5. Zawył z przerażenia, gdy zdałem sobie sprawę, że w mojej lokalnej piaskownicy pojawiło się wiele innych zmian i właśnie je wszystkie wymazałem. (serwer svn nie działał w zeszły piątek, więc nie mogłem ich sprawdzić i zapomniałem o nich w weekend)

Na szczęście w tym przypadku wykonałem „svn diff> temp.txt” przed wyjściem z pracy w piątek, a plik temp.txt wciąż był na moim dysku twardym, więc mogłem wprowadzić ten plik do „łaty” i odzyskać utracone zmiany.

Ale na przyszłość (tj. Następnym razem, gdy popełnię ten sam głupi błąd) ... czy jest jakiś sposób, aby nakazać svn cofnąć „powrót svn”? Czy svn zachowuje gdziekolwiek kopię zapasową lokalnych / niezaznaczonych różnic?

Jeremy Friesner
źródło
34
IIRC TortoiseSVN przenosi przywrócone pliki do kosza, ale oryginalny klient wiersza poleceń SVN nie ma takich niuansów.
Dario Solera
1
Nie mogę znaleźć pliku w koszu. Czy nie mam szczęścia?
dalcantara
5
Najlepszy komentarz dotyczący kosza. To właśnie uratowało mi dzień!
OrganicPanda
2
moje też! Dziękuję bardzo. Przywrócony plik właśnie pojawił się w moim koszu i można go było przywrócić.
sladda
1
Właśnie uratowałeś mój tyłek z tym koszem !!!
Epirocks

Odpowiedzi:

79

Nie, (absolutnie) NIE .

Jeśli powiesz, że Subversion powinno cofnąć plik, wszystkie zmiany znikną.

Tylko twoja pamięć może je odzyskać.

Wyjątek: nowe pliki, które dodałeś, stracą tylko status „dodane”, ale plik pozostanie w tym katalogu, tylko status jest nieznany („?”)

Wyjątek platformy / oprogramowania: Używając TortoiseSVN w systemie Windows, Przywróć najpierw wrzuca pliki do Kosza, a następnie przywraca je. Możesz kopać do Kosza, aby odzyskać pliki.

Peter Parker
źródło
10
Dodatek do powyższego: Kontrola wersji pomaga tylko wtedy, gdy faktycznie zatwierdzasz pliki. Jeśli jesteś w sytuacji, w której zabicie kopii roboczej zabije godziny pracy, to nie angażujesz się wystarczająco często.
myron-semack
1
Zgoda ... w tym przypadku serwer svn był wyłączony i dlatego mam niezatwierdzone zmiany wciąż oczekujące. : ^ (
Jeremy Friesner
13
Tak!!! Jest sposób na wyzdrowienie w zależności od twojego O / S i / lub IDE - przeczytaj pozostałe odpowiedzi poniżej, zanim dostaniesz zawału serca !!
HDave
2
To nieprawda, to trochę bardziej skomplikowane niż zwykłe NIE. Użyj narzędzia do odzyskiwania lub, jeśli masz szczęście, pliki znajdują się w koszu.
RaphMclee
1
@RalphMclee: To zależy od platformy i klienta svn. TortoiseSVN zapisze przywrócone nowe pliki w koszu. To tylko wyjątek. I wątpię, czy narzędzie do odzyskiwania może odtworzyć zmiany w twoich plikach w spójny sposób. O wiele łatwiej i jaśniej jest to zapamiętać: cofnięcie zniszczy twoją pracę, używaj jej ostrożnie!
Peter Parker
104

Jest rozwiązanie ... przejdź do kosza, znajdziesz tam najnowszą wersję usuniętego pliku. Żółw „wyrzuca” do kosza każdy przywrócony plik.

shto
źródło
2
Nawiasem mówiąc, jest to również powód, dla którego TortoiseSVN wydaje się tak powolny podczas wykonywania zwrotów. Przeniesienie pliku do kosza jest bardzo powolną operacją, gdy kosz jest pełny. Możecie wyłączyć tę funkcję w ustawieniach TortoiseSVN „Ogólne - okna dialogowe 1”.
Wim Coenen
8
Dzięki stary, uratowałeś mnie! Przypadkowo zrobiłem Revert i prawie straciłem 2 tygodnie pracy. Na szczęście znalazłem go w koszu.
Arie Livshin
2
@ArieLivshin, dlaczego miałbyś pracować przez 2 tygodnie bez zobowiązań? Wygląda na to, że musisz dowiedzieć się więcej o gałęziach.
JoelFan
Irytująco ankhsvn tego nie robi
Phil Hale
Dziękuję .. Bardzo pomocne.
Prem Singh Bist
32

Niezupełnie specyficzne dla Subversion, ale jeśli pracujesz z Eclipse, możesz spróbować szczęścia w lokalnej historii.

Teraz coś bardziej specyficznego dla Subversion: jeśli nie chcesz tworzyć gałęzi dla każdej wprowadzanej zmiany, możesz wyewidencjonować kilka linii trunk lokalnie (trunk-modif-1, trunk-modif-2 .. .). Każda „modyfikacja” jest wykonywana na osobnym drzewie i wystarczy zachować listę, której wyewidencjonowanie odpowiada której modyfikacji.

Lub możesz użyć Git lokalnie, ale nigdy tego nie próbowałem.

Vladimir
źródło
3
Do Twojej wiadomości - przejdź do historii lokalnej za pomocą menu kontekstowego prawego przycisku myszy „Przywróć z historii lokalnej”.
HDave
Jeśli chodzi o część Eclipse, oto bardziej konkretna odpowiedź: stackoverflow.com/a/18220708/517705
Sk8erPeter
14

Niedawno popełniłem ten błąd, że nie wprowadzałem nowych zmian plików (około 10) do SVN i wszystkie zniknęły z powodu mojego głupiego błędu. Ale to, co mnie uratowało, to opcja „Przywróć poprzednie wersje” systemu Windows w menu kontekstowym. Uff, to była ulga i wyciągnięta lekcja.

JProgrammer
źródło
Dziękuję Ci! To uratowało mnie od ponawiania godzin pracy! Nigdy wcześniej nie widziałem tej funkcji okien, ale uratowała mój boczek!
NibblyPig
Gdzie mogę wysłać 6000 $, które jestem ci za to winien, oszczędzając w ten sposób dni pracy?
Wyciągnięta
Dziękuję, to uratowało mi dzień.
Opax Web
Trzymam wyłączone punkty kontrolne obsługujące takie przywracanie, ponieważ psuje to wydajność. Niedawno Eclipse usunęło folder moich projektów, w tym archiwum git, z powodu problemu z funkcją Cofnij, a ja wolałem, aby był włączony. Jednak program Windows o nazwie Recuva uratował mnie, przeszukując usuniętą przestrzeń plików. Bardzo uważałem, aby nie dodawać dodatkowej zawartości do dysku, którego dotyczy problem, dopóki nie odzyskałem wszystkich moich plików i dzięki temu otrzymałem każdy plik źródłowy zmieniony od czasu ostatniej kopii zapasowej tydzień wcześniej. Pliki binarne w większości nie były możliwe do odzyskania.
Carl
8

Nie możesz odzyskać plików, jeśli używasz klienta wiersza poleceń svn .

Ale możesz je odzyskać, jeśli używasz TortoiseSVN jako swojego klienta svn. TortoiseSVN automatycznie przeniesie je do Kosza. Możesz je stamtąd przywrócić po przypadkowym przywróceniu.

Jest to konfigurowalna opcja w TortoiseSVN. Znajduje się w Ustawienia -> Okno 1 -> Użyj kosza podczas przywracania.

Domyślnie jest zaznaczone, co oznacza, że ​​pliki są przenoszone do kosza. Jeśli chcesz (przeważnie nie chcesz tego wyłączać. Jeśli masz powód, daj mi też znać)

Manohar
źródło
1
Niesamowite! ... uratował mnie
Janani Kumar
6

Jeśli korzystasz z InteliJ, masz szczęście. W górnym menu masz opcję kontroli wersji, a pod nią znajdziesz opcję historii lokalnej, w której znajdziesz całą historię wybranego pliku, w tym wszystkie operacje, które wykonałeś na tym pliku (aktualizacja, zatwierdzenie, przywrócenie).

Powodzenia, Arkde

Aurelian Cotuna
źródło
1
A jeśli był to nowy plik, sam plik zostanie usunięty. W takim przypadku wybierz folder, w którym znajdował się plik w widoku projektu, a następnie wybierz opcję „Historia lokalna”. IntelliJ znowu uratował sytuację.
Nufail
4

Ponadto, jeśli przywróciłeś swój kod .NET (pliki .cs itp.) I zbudowałeś aplikację przed przywróceniem, ale po wprowadzeniu zmian, możesz odzyskać zmiany z pliku zespołu za pomocą dowolnego narzędzia reflektora do przeglądania kodu.

scor4er
źródło
3

Miałem ogromne szczęście, że w przeglądarce historii w Eclipse znalazłem lokalny dziennik zmian pliku (wersje lokalne). Sprawdzałem różnice jeden po drugim i przed nadpisaniem dokonałem kilku zapisów pliku.

fyts
źródło
2

Przywróciłem rozwiązanie (Visual Studio + AnkhSVN) i straciłem zmiany kilku plików. Nie mogę znaleźć pliku w koszu.

ALE: odzyskałem utracone pliki za pomocą Handy Recovery, tj. SVN po prostu usuwa moje pliki podczas przywracania.

Użyj dowolnego oprogramowania do odzyskiwania danych, aby odzyskać przywrócone pliki (np. Wersja próbna Handy Recovery )

Peter Barbanyaga
źródło
1

Nie, SVN nie prowadzi dziennika ani kopii zapasowej (chociaż istnieje rozwiązanie dla TortoiseSVN wymienione w innych odpowiedziach).

Ale na wypadek, gdyby ktoś przeglądał odpowiedzi i nie zauważył tego komentarza w pytaniu PO:

„Na szczęście w tym przypadku wykonałem„ svn diff> temp.txt ”przed wyjściem z pracy w piątek, a plik temp.txt wciąż znajdował się na moim dysku twardym, więc mogłem wprowadzić ten plik do„ poprawki ”i odzyskać moje utracone zmiany ”.

Wyobrażam sobie, że powszechnym paradygmatem jest zrobienie 'svn diff' PRZED wykonaniem 'svn revert'. Jeśli przyzwyczaisz się to robić, nawet jeśli różnica jest właśnie przekazywana do terminala, masz przynajmniej jedną możliwą drogę do odzyskania utraconych zmian.

shaneb
źródło