Lepszy sposób na powrót do poprzedniej wersji SVN pliku?

167

Przypadkowo umieściłem zbyt wiele plików w repozytorium SVN i zmieniłem kilka rzeczy, których nie chciałem. (Wzdycha.) Najlepsze, co mogłem wymyślić, było przywrócenie ich do poprzedniego stanu

svn rm l3toks.dtx
svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

Jezu! Czy nie ma lepszego sposobu? Dlaczego nie mogę po prostu napisać czegoś takiego:

svn revert -r 854 l3toks.dtx

OK, używam tylko wersji 1.4.4, ale przejrzałem listę zmian dla gałęzi 1.5 i nie widziałem nic bezpośrednio z tym związanego. Czy coś przegapiłem?


Edycja: Myślę, że nie byłem wystarczająco jasny. Nie sądzę, że chcę, aby odwrócić seryjnej, bo wtedy stracę zmiany, że zrobili chcesz zrobić! Powiedz to fileAi fileBoba zostały zmodyfikowane, ale chciałem tylko zatwierdzić fileA; przypadkowe wpisanie

svn commit -m "small change"

zatwierdza oba pliki, a teraz chcę wycofać fileB. Scalanie odwrotne sprawia, że ​​to zadanie nie jest łatwiejsze (o ile wiem) niż kroki, które opisałem powyżej.

Will Robertson
źródło
Możliwy duplikat Jak cofnąć zatwierdzenie SVN?
Vadzim

Odpowiedzi:

243
svn merge -r 854:853 l3toks.dtx

lub

svn merge -c -854 l3toks.dtx

Te dwa polecenia są równoważne .

orip
źródło
5
Dzięki za to, chciałem tylko coś powiedzieć - powiedzmy, jestem na wersji 855, chcę przywrócić plik do wersji 854. Jeśli to zrobię svn merge -c -854 my.file, a potem to zrobię svn diff, wydaje się, że pokazuje jedną wersję wcześniejszą niż 854 (czyli 853 ); tylko wtedy, gdy to zrobię svm merge -c 854 myfile(bez -), wygląda na to, że mój plik jest przywrócony do rev 854. Jeszcze raz dziękuję, wiwaty!
sdaau
11
Czy jest jakiś powód, dla którego pierwsza opcja powyżej działała dla mnie jak urok, a druga wcale nie działała?
skybondsor
7
Nie zapomnij jednak o zatwierdzeniu po odwrotnym scaleniu. Często zapominam :)
Vineeth Pradhan,
11
Naprawdę powinienem odjąć 1 to za brak określenia różnicy między tymi dwoma poleceniami. Słaba odpowiedź
Angry Dan
4
@sprog - jeśli jest jakaś różnica, byłbym wdzięczny, gdybyś wiedział
orip,
34

Sprawdź sekcję „ cofanie zmian ” w książce svn

luapyad
źródło
5
Zachęcamy do umieszczania linków do zewnętrznych zasobów, ale proszę dodać kontekst wokół łącza, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje. Zawsze cytuj najbardziej odpowiednią część ważnego linku, na wypadek gdyby strona docelowa była nieosiągalna lub została trwale wyłączona.
user2084795
32

przepraszam, że wykorzystuję trochę miejsca tylko na powtórzenie poprzedniej odpowiedzi - ale z tym zawsze mam kłopoty.

Powiedzmy, że zaktualizowałem lokalne pliki do najnowszej wersji, czyli 854. Następnie chciałbym uzyskać starszą wersję - wersję pliku z kilku wersji wcześniejszych, powiedzmy wersję 851.

Kopiowanie zadziała:

svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx

.. jednak nie przeszkadza mi szukanie adresu URL repozytorium :)

Aktualizacja pozornie może działać:

svn up -r 851 ./l3toks.dtx

... jednak oznacza to również kopię lokalną jako „świeżo wyewidencjonowaną” lub raczej „taką samą jak wersja online” (np. w Tortoise / RabbitVCS dostajesz zielony znacznik OK) - co oznacza, że ​​nie możesz tego zrobić svn ci -m "rolled back to r 851": po prostu dlatego, że lokalna subversionplik wykonywalny nie zauważy żadnych lokalnych zmian i nie będzie przejmował się przesyłaniem czegokolwiek do repozytorium online.

I, jak już odpowiedziałem, odwrotne scalanie działa - ale w tym przypadku nie należy polegać na składni skrótów; ale konkretnie określ:

svn merge -r HEAD:851 l3toks.dtx
--- Reverse-merging r854 through r852 into 'l3toks.dtx':
U    l3toks.dtx

Muszę przyznać - nigdy bym nie zrozumiał zdania " Odwrotne scalanie r854 do r852 do pliku ", które oznaczałoby " Właśnie dostałem r851 z twojego pliku i nadpisałem to, co miałeś wcześniej lokalnie - i jest oznaczone jako inne niż ostatnia wersja online, więc możesz to sprawdzić online jako nową wersjęwycofania ”, ale myślę (i mam nadzieję :)) tak właśnie działa :)

Następnie można svn diffszybko sprawdzić, czy lokalnie otrzymaliśmy właściwą wersję; a także, plik zostanie oznaczony czerwonym wykrzyknikiem w Tortoise / RabbitVCS (to znaczy inaczej niż ostatnia zatwierdzona wersja), więc svn ci -m "rolled back to r 851"może zostać uruchomiony tym razem.

Zwróć również uwagę, że jeśli w końcu zmienisz zdanie po scaleniu odwrotnym ( tj. I tak chcesz nadal pracować nad najnowszą wersją HEAD, tutaj 854 - po przywróceniu lokalnie do 851, ale jeszcze nie zatwierdziłeś wycofania ), nie powinieneś używać svn up, ponieważ po prostu powie, że jest już „ W wersji 854 ”; użyj zamiast tego svn revert --recursive .lub podobnego ...

Twoje zdrowie!

Ref: Jak przywrócić zmiany za pomocą Subversion - Jacob Wright - Flex, AIR, PHP itp.

EDYCJA: ... i najwyraźniej dokładnie taki sam efekt svn merge -r HEAD:851 l3toks.dtx, jaki można osiągnąć za pomocą:

svn export -r 851 l3toks.dtx
A    l3toks.dtx
Export complete.
sdaau
źródło
2
ZAWSZE powinieneś preferować eksport svn, ponieważ robi dokładnie to, co chcesz - wyewidencjonuj plik w określonej wersji, podczas gdy odwrotne scalanie będzie również próbowało scalić twoje lokalne zmiany z określoną wersją, jest to złożona i szalona operacja, którą jest podatny na błędy, jeśli nie będziesz uważać!
Falco
1
Miałem problemy z odwrotnym scalaniem. Zamiast dowiedzieć się dlaczego, po prostu spróbowałem eksportować i zadziałało idealnie. Gorąco polecam użycie eksportu. Możesz użyć --forcedo nadpisania katalogów. Pamiętaj tylko, że nadpisze wszelkie zmiany.
Nick
Bardzo dobre wyjaśnienie tego, co się naprawdę dzieje! Często używam AnkhSVN i TortoiseSVN i nie widzę miejsca, z którego svn exportmógłbym skorzystać - czy coś mi brakuje, czy po prostu nie jest to zaimplementowane w tych GUI?
Conrad
@Conrad, używasz tego, klikając "Eksportuj ..." w AnkhSVN i "Eksportuj" w TortoiseSVN z menu kontekstowego repozytorium (kliknij prawym przyciskiem myszy)
nitinr708
10

Niedawno musiałem powrócić do określonej wersji, aby debugować starszą kompilację, a to działało jak magia:

svn up -r 3340 (or what ever your desired revision number)

Musiałem rozwiązać wszystkie konflikty za pomocą opcji "tc", ponieważ nie przejmowałem się lokalnymi zmianami (sprawdziłem wszystko, na czym mi zależało przed przywróceniem)

Powrót do głównej wersji również był prosty:

svn up
Igor
źródło
5

To, czego szukasz, nazywa się „odwrotnym scalaniem”. Powinieneś skonsultować się z dokumentacją dotyczącą funkcji scalania w książce SVN (jak wskazuje luapyad, a dokładniej pierwszy komentator tego postu). Jeśli używasz Tortoise, możesz również po prostu przejść do widoku dziennika, kliknąć prawym przyciskiem myszy i wybrać „Cofnij zmiany z tej wersji” na tej, w której popełnisz błąd.

rmeador
źródło
4

Scalanie odwrotne jest dokładnie tym, czego chcesz (zobacz odpowiedź luapyada). Po prostu zastosuj scalenie do błędnie zatwierdzonego pliku zamiast do całego katalogu.

Tomek
źródło
4

Jeśli chcesz cofnąć tylko ostatnie zameldowanie, możesz skorzystać z poniższych

svn merge -r head:prev l3toks.dtx

W ten sposób nie musisz szukać aktualnych i poprzednich numerów wersji.

Ken Russell
źródło
4

Scalanie svn spowoduje scalenie wersji, a nie ich przywrócenie. tzn. jeśli masz jakiś dodatek w swojej wersji HEAD, a następnie połącz go z poprzednią wersją, a zmiana będzie trwała.

Używam svn cat, a następnie przekierowuję go do pliku:

svn cat -r 851 l3toks.dtx > l3toks.dtx

Następnie masz zawartość 851 w tym pliku i możesz ją ponownie wpisać.

Dylan
źródło
3

Jeśli używasz Eclipse IDE z wtyczką SVN , możesz wykonać następujące czynności:

  1. Kliknij prawym przyciskiem myszy pliki, które chcesz przywrócić (lub folder, w którym się znajdują, jeśli usunąłeś je przez pomyłkę i chcesz dodać je z powrotem)
  2. Wybierz „ Zespół> Przełącz
  3. Wybierz przycisk radion „Wersja” i wprowadź numer wersji, do której chcesz powrócić. Kliknij OK
  4. Przejdź do perspektywy Synchronizuj
  5. Wybierz wszystkie pliki, które chcesz przywrócić
  6. Kliknij prawym przyciskiem myszy zaznaczenie i wykonaj polecenieZastąp i zatwierdź ...

Spowoduje to przywrócenie plików do żądanej wersji. Pamiętaj tylko, że SVN potraktuje te zmiany jako nowe zatwierdzenie. Oznacza to, że zmiana otrzymuje nowy numer wersji i nie ma powiązania między starą wersją a nową. Powinieneś określić w komentarzach do zatwierdzenia, że ​​przywracasz te pliki do określonej wersji.

ceiroa
źródło