Jak przywrócić zatwierdzenie SVN?

303

Znalazłem różne przykłady, jak przywrócić zatwierdzenie SVN

svn merge -r [current_version]:[previous_version] [repository_url]

lub

svn merge -c -[R] .

Ale żadne z nich nie działa. Próbowałem tych poleceń i sprawdziłem pliki, które zostały zmienione ręcznie.

Jak przywrócić zatwierdzenie z numerem wersji 1944? Jak sprawdzić, czy przywrócenie zostało wykonane (bez przeglądania rzeczywistego pliku, zmiany zostały cofnięte)?

Alex
źródło
16
Czy nigdy nie zaakceptowałeś odpowiedzi, ponieważ żaden z nich nie działał?
2rs2ts
4
Jeśli chcesz uzyskać dosłowną odpowiedź, użyj „svn merge -c -1944”. Aby sprawdzić, czy zadziałało: „svn diff”
John Sampson
Co jeśli sprawa, mam 1943 (dobre zatwierdzenie), potem 1944 (złe zatwierdzenie), potem 1945 (dobre zatwierdzenie), a następnie 1946 (dobre zatwierdzenie). Teraz chcę usunąć tylko 1944 (złe zatwierdzenie) i zachować wszystkie poprawki po 1944 r., Co oznacza, że ​​chcę uzyskać wynik podobny do 1943,1945,1946 (usunąć tylko 1944) z wszystkich tych poprawek, co powinienem zrobić?
Bhavin_m

Odpowiedzi:

447

Oba przykłady muszą działać, ale

svn merge -r UPREV:LOWREV . cofnij zakres

svn merge -c -REV . cofnij pojedynczą wersję

w tej składni - jeśli bieżącym katalogiem jest WC i (jak należy to zrobić po każdym scaleniu), zatwierdzisz wyniki

Czy chcesz zobaczyć dzienniki?

Leniwy Borsuk
źródło
9
@dwjohnston - tak, scalanie zawsze odbywa się w WC i nie jest to zadanie po stronie serwera
Lazy Badger
14
svn: Merge source required. Nie ma kości.
2rs2ts
27
@ 2rs2ts wygląda tak, jakbyś zapomniał końcowej kropki oznaczającej „zrób to w bieżącym katalogu”.
Dalin
14
możesz także wykonać wiele pojedynczych zatwierdzeń w tym samym czasie:svn merge -c -42587,-42589 .
2014
1
@ahnbizcad - wersja (pojedyncza), którą chcesz cofnąć
Lazy Badger
130

Jeśli używasz klienta TortoiseSVN , można to łatwo zrobić za pomocą okna dialogowego Pokaż dziennik .

dodgy_coder
źródło
5
Jest to zdecydowanie najłatwiejszy sposób na zrobienie tego
Markku K.,
5
To jest przestarzałe. W bieżącej wersji nie ma już menu kontekstowego dla klienta.
user1789573,
19
Co? TortoiseSVN JEST menu kontekstowym oraz okien dialogowych, które się odradza. Co rozumiesz przez „nie ma już menu kontekstowego”? Z pewnością jest!
Ben
@Ben Myślę, że użytkownik1789573 trochę się potknął w związku z wyraźną wzmianką o „menu kontekstowym” w samouczku do którego link znajduje się w odpowiedzi.
Tom Catullo
2
Jeśli zobaczysz to później, jest (nadal) tam. Na ekranie dziennika pokazu kliknij wersję prawym przyciskiem myszy, a pojawi się opcja „Przywróć tę wersję”. To jest w TortoiseSVN 1.9.4 Build 27285. Właśnie go użyłem i mogę powiedzieć, że działa dobrze.
Bruce Van Horn
64

svn merge -r 1944:1943 .powinien przywrócić zmiany r1944 w kopii roboczej. Następnie możesz przejrzeć zmiany w kopii roboczej (z diff), ale musisz zatwierdzić, aby zastosować przywrócenie do repozytorium.

onon15
źródło
4
Nie działa, wymaga źródła scalania. Próbowałem svn merge -r 1944:1943 .zamiast tego, ale nic się nie zmieniło.
Alex
Czy repozytorium jest zaawansowane od r1944? Jeśli tak, to czy występują sprzeczne zmiany na tych samych liniach co zmiany między r1943 i r1944?
onon15
Jestem w wersji 1945 i wydaje się, że nie ma konfliktu. Ani nic, ani svn statusnie svn diffdaje.
Alex
7
Błąd:svn: Try 'svn help' for more info svn: Merge source required
Alex
5
Ale svn merge -r 1945:1943 .wydaje się, że zadziałało. Wydaje mi się, że rozumiem: musisz scalić wersję „przed” „złym” zatwierdzeniem w działającym repozytorium. Jest to dobre, gdy chcesz wykonać proste „przywrócenie” poprzedniego zatwierdzenia. A jeśli chcesz cofnąć zmiany wprowadzone w wersji 1900?
Alex,
44

Najpierw przywróć kopię roboczą do 1943 r.

> svn merge -c -1943 .

Po drugie, sprawdź, co zostanie zatwierdzone.

> svn status

Po trzecie, zatwierdzić wersję 1945.

> svn commit -m "Fix bad commit."

Po czwarte, spójrz na nowy dziennik.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------
Shaun Luttin
źródło
1
Co jeśli sprawa, mam 1943 (dobre zatwierdzenie), potem 1944 (złe zatwierdzenie), potem 1945 (dobre zatwierdzenie), a następnie 1946 (dobre zatwierdzenie). Teraz chcę usunąć tylko 1944 (złe zatwierdzenie) i zachować wszystkie poprawki po 1944 r., Co oznacza, że ​​chcę uzyskać wynik podobny do 1943,1945,1946 (usunąć tylko 1944) z wszystkich tych poprawek, co powinienem zrobić?
Bhavin_m
26

Nie można „odrzucić” wersji, ale można przywrócić kopię roboczą do wersji 1943 i zatwierdzić ją jako wersję 1945. Wersje 1943 i 1945 będą identyczne, skutecznie cofając zmiany.

Jakub Zaverka
źródło
18
Żeby być irytująco dokładne, chciałbym skomentować, że jeśli masz dostęp administratora do repozytorium, możesz „odrzucić”. Tworzy to repozytorium klonów aż do danej wersji za pomocą, svn dumpa następnie svn load. Ale oczywiście nie należy tego używać w normalnych okolicznościach.
onon15
4
Nie chcę anulować polecenia, chcę utworzyć nowy numer zatwierdzenia z pewnym odwróconym zatwierdzeniem. Zestawy mówią, że sprawdziłem wersję 1944, dokonałem zatwierdzenia w 1945 roku, które chcę „przywrócić”. Potem chcę mieć wersję 1946, której pliki są identyczne z plikami w wersji 1944. (Z wyjątkiem oczywiście historii.) Pozostaje jednak pytanie: jak to zrobić? Jakie są polecenia?
Alex
//, @Alex, też mnie to interesuje, szczególnie coś analogicznego do $ git revert. Trudno mi było nauczyć się SVN po tak długim używaniu Gita.
Nathan Basanese
9

Jak powiedziano, poniższe czynności wykonają próbę próbną. HEAD jest bieżącą wersją, poprzednia jest PREV, a następnie ścieżka do pliku lub zatwierdzonego elementu:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Jeśli suchy przebieg wygląda dobrze, uruchom polecenie bez --dry-run

Sprawdź zmianę w wersji i ponów zatwierdzenie. Aby przeglądać numery wersji, spróbuj:

svn log
BentheFolker
źródło
4
F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F
jmullee
źródło
Czy wymaga to, aby kopia lokalna różniła się od złej wersji?
Eliezer Miron
2

Alex, spróbuj tego: svn merge [WorkingFolderPath] -r 1944: 1943

Nikita
źródło
2

Chociaż podane już sugestie mogą działać dla niektórych osób, nie działa to w moim przypadku. Podczas scalania użytkownicy, rev 1443którzy dokonują aktualizacji rev 1445, nadal synchronizują wszystkie zmienione pliki, 1444nawet jeśli są równe1443 scaleniu. Potrzebowałem użytkowników końcowych, aby w ogóle nie widzieli aktualizacji.

Jeśli chcesz całkowicie ukryć zatwierdzenie, możesz utworzyć nowy oddział przy poprawnej wersji, a następnie zamienić gałęzie. Jedyne, co musisz zrobić, to usunąć i ponownie dodać wszystkie blokady.

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

To zadziałało dla mnie, być może będzie pomocne dla kogoś innego =)

Droxxodia
źródło
2
svn merge -c -M PATH

To uratowało mi życie.

Miałem ten sam problem, po cofnięciu również nie widziałem starego kodu. Po uruchomieniu powyższego polecenia otrzymałem czysty stary kod wersji.

amit ghosh
źródło
1

Próbowałem wyżej, ( svn merge) i masz rację, to robi jack. jednak

svn update -r <revision> <target> [-R]

wydaje się działać, ale nie jest stały (mój svn po prostu pokazuje starą wersję). Więc musiałem

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

W moim szczególnym przypadku moim celem jest interfaces/AngelInterface.php. Dokonałem zmian w pliku, zatwierdziłem je, zaktualizowałem komputer kompilacji, uruchomiłem kompilator phpdoc i stwierdziłem, że moje zmiany były stratą czasu. svn log interfaces/AngelInterface.phppokazuje moją zmianę jako r22060, a poprzednie zatwierdzenie w tym pliku to r22059. Więc mogę svn update -r 22059 interfaces/AngelInterface.phpi skończy się z kodem, jak to było w -r22059. Następnie :-

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

Alternatywnie mógłbym zrobić to samo w katalogu, podając . -Rw miejsce interfaces/AngelInterface.phpwszystkich powyższych.

Sibaz
źródło
1
Inną rzeczą, jak już powiedziano, jest to, czego nie można zrobić, to usunąć zatwierdzenie z historii, tak jak można to zrobić w git, bezpośrednio hakując polecenia. Wszystko, co możesz zrobić, to użyć repozytorium, aby zmienić źródło zgodnie z twoimi intencjami i zatwierdzić to jako zmianę.
Sibaz
Po dokładniejszym zbadaniu widzę, że można usunąć zatwierdzenie z historii za pomocą svnadmin, ale zdecydowanie odradzam to. Zobacz stackoverflow.com/questions/5566327/…
sibaz,
0

Jeśli chcesz całkowicie usunąć zatwierdzenia z historii, możesz również wykonać zrzut repo przy określonej wersji, a następnie zaimportować ten zrzut. Konkretnie:

svnrdump dump -r 1:<rev> <url> > filename.dump

Komenda svnrdump wykonuje tę samą funkcję co zrzut svnadmin, ale działa na zdalnym repozytorium.

Następnie wystarczy zaimportować plik zrzutu do wybranego repozytorium. Zostało to przetestowane, aby działało dobrze na Beanstalk.

rudowłosy
źródło