Jak wrócić do starszej wersji naszego kodu w Subversion?

486

Pracuję nad projektem z przyjacielem i chcę wrócić do starszej wersji naszego kodu i ustawić go jako bieżący. Jak mam to zrobić?

Używam „anksvn” na vs08.

Mam wersję, którą chcę na komputerze, ale zatwierdzenie nie powiedzie się; Otrzymuję komunikat „zatwierdzenie nie powiodło się, plik lub katalog jest nieaktualny”.

Mam również klienta subversion na moim komputerze.

Chen Kinnrot
źródło

Odpowiedzi:

783

Zasadniczo musisz „scalić wstecz” - zastosować różnicę między bieżącą a poprzednią wersją do bieżącej wersji (aby uzyskać kopię roboczą wyglądającą jak stara wersja), a następnie zatwierdzić ponownie. Na przykład, aby przejść z wersji 150 (bieżącej) z powrotem do wersji 140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

Czerwona Księga Subversion ma dobrą sekcję na ten temat .

Jon Skeet
źródło
3
ale scalenie nie zastępuje moich zmian i nowej wersji.
Chen Kinnrot
76
Jeśli używasz TortoiseSVN, kliknij prawym przyciskiem myszy plik, wybierz Scal, a następnie Scal zakres zmian. W polu dziennika wpisz 140-150 i kliknij pole wyboru Odwróć. Następnie wykonaj jak zwykle. Spowoduje to wykonanie tej samej operacji, co w przykładzie Jona.
DavGarcia,
8
W przypadku zaćmienia i podciśniecia możesz kliknąć prawym przyciskiem myszy swój projekt, Historia zespołu / historii, a następnie wybrać, a następnie zmiany, które chcesz „cofnąć”, a kolejnym kliknięciem prawym przyciskiem myszy wybrać „Cofnij zmiany z wybranych wersji”.
fego
36
Aby cofnąć się od wersji głowy, możesz także napisać svn merge -r HEAD:140.
sschmeck
3
@ Instrukcje TortoiseSVN DavGarcia były dla mnie niewłaściwe, przynajmniej nie przywracania wszystkich plików w wersji (używając TortoiseSVN 1.8.8). Kliknij folder prawym przyciskiem myszy, wybierz TortoisSVN-> Pokaż dziennik. Wybierz wersję, którą chcesz cofnąć, kliknij prawym przyciskiem myszy, mówiąc: „Przywróć zmiany z tej wersji”. Zatwierdź zmiany.
mhenry1384
177

Można popełnić tylko nowe zmiany na głowie historii Subversion.

Powodem, dla którego nie możesz nic zrobić bezpośrednio z dobrą kopią, którą masz na komputerze, jest to, że jego .svnfoldery wiedzą, że jest to kod z przeszłości, dlatego wymaga aktualizacji przed zatwierdzeniem.

Znajdź dobry numer wersji i cofnij

  1. Znajdź numer wersji starej kopii, którą chcesz.

    Uzyskaj swoją aktualną wersję dzięki:

    svn info --show-item revision
    # or
    svn log

    Lub, aby sprawdzić starsze wersje swojego projektu, użyj:

    svn update -r <earlier_revision_number>

    aż znajdziesz odpowiedni numer wersji.

  2. Zanotuj dobry numer wersji (zakładając 123przykłady poniżej).

  3. Zaktualizuj do najnowszej wersji:

    svn update
  4. Cofnij wszystkie zmiany między żądaną wersją a najnowszą wersją:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (to samo co powyżej odpowiedź Jona Skeeta).

Jeśli nie możesz znaleźć numeru wersji

Jeśli nie możesz znaleźć starej kopii, a chcesz po prostu zatwierdzić pliki na komputerze:

  1. Zrób kopię dobrej wersji (ale bez .svnfolderów):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. Teraz upewnij się, że masz najnowszą wersję:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. Skopiuj dobrą wersję na kopię kopii roboczej.

    To polecenie skopiuje, a także usunie wszystkie pliki z drzewa roboczego, których nie ma w dobrej kopii, ale nie wpłynie to na istniejące .svnfoldery.

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    Jeśli nie masz rsync, możesz go użyć, cp -aale będziesz musiał również ręcznie usunąć niechciane pliki.

  4. Powinieneś być w stanie dokonać tego, co masz teraz.

    cd project
    svn commit "Reverted to good copy"
joeytwiddle
źródło
2
svn nie interpretuje tego jako modyfikacji, nie mogę tego zatwierdzić.
Sandburg
svn merge -r HEAD: 12345. jest poprawnym poleceniem przywracania, nie rób aktualizacji -r. Jesteś szaloną osobą.
Sowa,
Wydaje mi się, że ta odpowiedź została pozytywnie oceniona przez ludzi, którzy nie mogli znaleźć numeru wersji lub docenili wiodące wyjaśnienie. Zaktualizowałem odpowiedź, aby uwzględnić oba podejścia.
joeytwiddle
36

Po prostu użyj tej linii

Aktualizacja SVN -R yourOldRevesion

Możesz poznać swoją aktualną wersję, używając:

informacje svn

Człowiek ćma
źródło
15
To nie rozwiązuje problemu. Zamiast tego tworzy stan, w którym pytający był w momencie zadawania pytania.
Ingo Schalk-Schupp
1
Jeśli niefortunnie zastosowałeś się do tej rady, uruchom: „svn resolver - zaakceptuj działanie -R”.
Sowa,
27

Standardowy sposób użycia scalania do cofnięcia całego odprawy działa świetnie, jeśli tego właśnie chcesz. Czasami wszystko, co chcesz zrobić, to przywrócić pojedynczy plik. Nie ma uzasadnionego sposobu, aby to zrobić, ale istnieje hack:

  1. Znajdź odpowiednią wersję za pomocą dziennika svn.
  2. Użyj komendy eksportu svn:

    svn export http: // url-to-your-file @ 123 / tmp / filename

(Gdzie 123 to numer wersji dobrej wersji pliku.) Następnie przenieś lub skopiuj ten pojedynczy plik, aby zastąpić stary. Sprawdź zmodyfikowany plik i gotowe.

Rachunek
źródło
Za pomocą Tortoise-svn mogę kliknąć pojedynczy plik prawym przyciskiem myszy i scalić go. Powinien też być sposób na zrobienie tego przy użyciu svn?
lc.
10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291
8

Trochę więcej starej szkoły

svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch

wtedy zwykłe

svn diff
svn commit
Yauhen Yakimovich
źródło
5

Myślę, że to najbardziej pasuje:

Wykonaj scalanie wstecz, na przykład, jeśli zatwierdzony kod zawiera wersję od wersji 5612 do 5616, po prostu scal ją wstecz. To działa na moim końcu.

Na przykład:

svn merge -r 5616:5612 https://<your_svn_repository>/

Zawierałby scalony kod z powrotem do poprzedniej wersji, a następnie można go zatwierdzić.

hpal
źródło
3

To właśnie zrobiłem i pracowałem dla siebie.

Chcę cofnąć zmiany w wielu zatwierdzeniach, które zrobiłem dla określonych czasów i chcę przejść do poprzedniego punktu zatwierdzenia.

  1. Idź do zespołu -> Pokaż historię.
  2. Kliknij prawym przyciskiem myszy lub zakres wersji, które chcesz zignorować.
  3. Wybierz opcję „Cofnij zmiany”.

Spowoduje to uruchomienie scalania wstecznego, cofając zmiany w kopii roboczej.

Wystarczy przejrzeć kod i zatwierdzić.

Ziya
źródło
2

Kliknij prawym przyciskiem myszy najwyższą hierarchię, którą chcesz przywrócić >> RevertlubRevert to Revision

Yuval Adam
źródło
2

Większość poprzednich odpowiedzi używała scalania zwrotnego, i to zwykle jest poprawna odpowiedź. Jest jednak jedna sytuacja (która właśnie mi się przydarzyła), w której jej nie ma.

Podczas niewielkiej zmiany przypadkowo zmieniłem plik z zakończeniami linii uniksowej na zakończenia linii DOS i zatwierdziłem go. Można to łatwo cofnąć, zmieniając zakończenia linii i zatwierdzając ponownie, lub scalając wstecz, ale powoduje to, że svn blamelista staje się moją edycją jako źródło każdej linii pliku. (Co ciekawe, TortoiseSVN w systemie Windows nie ma na to wpływu; tylko wiersz poleceń svn blame.)

Jeśli chcesz zachować historię zgłoszoną przez svn blame, myślę, że musisz wykonać następujące czynności:

  • Usuń plik i zatwierdź.
  • W repozytorium skopiuj poprzednią dobrą kopię pliku do nagłówka i zatwierdź.
  • Przywróć wszystkie zmiany, które chcesz zachować.

Usunięcie jest trochę przerażające, ale pamiętaj, że zawsze masz plik zapisany w repozytorium, więc przywrócenie go nie jest wielkim problemem. Oto kod ilustrujący poszczególne kroki. Załóżmy, że xxxjest to numer wersji ostatniej dobrej kopii.

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

Pamiętaj, że dla kopii w repozytorium miejscem docelowym musi być katalog, a nie nazwa pliku.

użytkownik2554330
źródło
1

Kliknij projekt prawym przyciskiem myszy> Zamień na> Wersja lub URL> Wybierz konkretną wersję, którą chcesz wycofać.

Teraz zatwierdz lokalną wersję kodu aktualizacji do repozytorium. Spowoduje to przywrócenie podstawy kodu do konkretnej wersji.

KayV
źródło
1

Na tej stronie znajduje się wiele niebezpiecznych odpowiedzi. Zauważ, że od wersji SVN 1.6 robienie aktualizacji -r może powodować konflikty drzew, które szybko przeradzają się w potencjalnie tracący dane koszmar kafkeresque, w którym poszukujesz informacji o konfliktach drzew.

Prawidłowy sposób powrotu do wersji to:

svn merge -r HEAD:12345 .

Gdzie 12345 to numer wersji. Nie zapomnij kropki.

Sowa
źródło
0

Zsynchronizuj ze starszą wersją i zatwierdź ją. To powinno załatwić sprawę.

Oto także wyjaśnienie cofania zmian.

Mork0075
źródło
0

Odpowiedź Jona Skeeta jest w skrócie rozwiązaniem, ale jeśli jesteś podobny do mnie, możesz chcieć wyjaśnienia. Podręcznik Subversion nazywa to a

Połącz Cherry-Pick

Ze stron podręcznika.

  1. Ta forma jest nazywana scalaniem „cherry-pick”: „-r N: M” odnosi się do różnicy w historii gałęzi źródłowej między wersjami N i M.

    Do cofania zmian można użyć „zakresu wstecznego”. Na przykład, gdy źródło i cel odnoszą się do tej samej gałęzi, wcześniej zatwierdzoną wersję można „cofnąć”. W zakresie wstecznym N jest większe niż M w „-r N: M” lub opcja „-c” jest używana z liczbą ujemną: „-c -M” jest równoważne z „-r M:”. Cofanie zmian tego typu jest również nazywane „scalaniem wstecznym”.


  • Jeśli źródłem jest plik, różnice są stosowane do tego pliku (przydatne w przypadku odwrotnego scalania wcześniejszych zmian). W przeciwnym razie, jeśli źródłem jest katalog, domyślnym celem jest „.”.

    W normalnym użyciu kopia robocza powinna być aktualna, z jedną wersją, bez lokalnych modyfikacji i przełączanych poddrzewa.

Przykład:

svn merge -r 2983:289 path/to/file

Zastąpi to lokalną kopię [2983] (która, zgodnie z cytatem powyżej, powinna być zsynchronizowana z serwerem - twoja odpowiedzialność) z wersją 289 z serwera. Zmiana następuje lokalnie, co oznacza, że ​​jeśli masz czystą kasę, zmiany można sprawdzić przed ich zatwierdzeniem.

Jonathan Komar
źródło
-1

Poniższe działało dla mnie.

Miałem wiele lokalnych zmian i musiałem odrzucić te z lokalnej kopii i pobrać ostatnią stabilną wersję w SVN.

  1. Sprawdź status wszystkich plików, w tym plików ignorowanych.

  2. Przeciągnij wszystkie linie, aby uzyskać nowo dodane i zignorowane pliki.

  3. Zamień je na //.

  4. i rm -rf wszystkie linie.

    status svn --no-ignore | grep '^ [? I]' | sed "s / ^ [? I] //" | xargs -I {} rm -rf "{}"

shah1988
źródło