2012-11-11 8 views
231

znalazłem różne przykłady jak odwrócenia SVN jakJak mogę cofnąć zatwierdzenie SVN?

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

lub

svn merge -c -[R] . 

Ale żaden z nich nie wydaje się działać. Próbowałem tych poleceń i sprawdzałem pliki, które zostały zmienione ręcznie.

Jak mogę przywrócić commit z numerem wersji 1944? Jak mogę sprawdzić, czy cofnięcie zostało wykonane (bez zaglądania do rzeczywistego pliku, aby zmiany zostały cofnięte)?

+11

Czy nigdy nie zaakceptowałeś odpowiedzi, ponieważ żaden z nich nie zadziałał? – 2rs2ts

+8

Odpowiedź Lazy'ego Badgera powinna zostać zaakceptowana. – Jeff

+4

Jeśli chcesz dosłownej odpowiedzi, użyj "svn merge -c -1944". Aby sprawdzić, czy zadziałało: "svn diff" –

Odpowiedz

38

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

+4

Nie działa, wymaga źródła scalania. Próbowałem zamiast tego 'svn merge -r 1944: 1943.', ale nic się nie zmieniło. – Alex

+0

Czy repozytorium zaawansowane od r1944? Jeśli tak, czy istnieją sprzeczne zmiany na tych samych liniach, co zmiany między r1943 a r1944? – onon15

+0

Jestem w rewizji 1945 roku i nie wydaje się, aby był konflikt. Ani 'svn status' ani' svn diff' nie dają niczego. – Alex

23

Nie można cofnąć powtórnej 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.

+17

Po prostu irytująco dokładny, chciałbym powiedzieć, że jeśli masz dostęp administracyjny do repozytorium, możesz "anulować" ". Tworzy to repozytorium klonów aż do danej wersji, używając 'svn dump', a następnie' svn load'. Ale oczywiście nie powinno się tego używać w normalnych okolicznościach. – onon15

+4

Nie chcę anulować polecenia, chcę utworzyć nowy numer zatwierdzenia z pewnym zatwierdzonym odwróceniem. Zestawy mówią, że wypróbowałem wersję 1944, dokonałem commit w 1945, którą chcę "przywrócić". Następnie chcę mieć wersję 1946, której pliki są identyczne z wersjami z 1944 roku. (Z wyjątkiem historii oczywiście.) Ale pozostaje pytanie: jak to zrobić? Jakie są polecenia? – Alex

+0

//, @Alex, również mnie to interesuje, szczególnie w czymś podobnym do '$ git revert'. Zauważyłem, że po tak długim czasie używania Git trudno jest się nauczyć SVN. –

361

Oba przykłady muszą pracować, ale

svn merge -r UPREV:LOWREV . zakres cofania

svn merge -c -REV . cofnąć pojedynczą zmianę

w tej składni - jeśli prąd dir jest WC i (jak należy wykonywać po każdym scaleniu) ty” ll zatwierdz wyniki

Czy chcesz zobaczyć logi?

+2

Czy chcesz to zrobić w kopii roboczej? – dwjohnston

+8

@dwjohnston - tak, scala ** zawsze wykonywane w WC ** i nie jest zadaniem po stronie serwera –

+12

'svn: Wymagane źródło scalenia'. Nie ma kości. – 2rs2ts

2

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

111

Jeśli używasz klienta TortoiseSVN, to łatwo zrobić via the Show Log dialog.

+5

Jest to zdecydowanie najłatwiejszy sposób na zrobienie tego. –

+2

To jest nieaktualne. Nie ma już menu kontekstowego dostępnego dla klienta w bieżącej wersji. – user1789573

+14

Co? TortoiseSVN JEST menu kontekstowym oraz dialogami, które odradza. Co masz na myśli przez "nie ma już menu kontekstowego"? Tam na pewno jest! – Ben

3
F=code.c 
REV=123 
svn diff -c $REV $F | patch -R -p0 \ 
    && svn commit -m "undid rev $REV" $F 
+0

To jest jedyna rzecz, która zadziałała dla mnie. –

5

Następujące zrobi suchobiegu, jak to mówi. HEAD jest aktualną wersję, POPRZEDNIE jest poprzednia, to ścieżka do pliku, lub popełnione pozycja:

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

Jeśli sucho wygląda dobrze, uruchom polecenie bez --dry metę

Sprawdź, czy zmiana w wersji i ponowne zatwierdzenie. Aby przeglądać numery wersji spróbować:

svn log 
1

Próbowałem powyżej (svn merge) i masz rację, to nie Jack. Jednak

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

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

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

W moim konkretnym przypadku moim celem jest interfaces/AngelInterface.php. Wprowadziłem zmiany do 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.php pokazuje moją zmianę jako r22060, a poprzednie zatwierdzenie dla tego pliku to r22059.Więc mogę svn update -r 22059 interfaces/AngelInterface.php i kończę z kodem, jak to było w -r22059 ponownie. 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 

Ewentualnie mogę zrobić to samo na katalogu, określając . -R zamiast interfaces/AngelInterface.php we wszystkich wyżej wymienionych.

+1

Jeszcze jedna rzecz, jak już powiedziano, nie można usunąć commit z historii, tak jak można to zrobić w gitarze, bezpośrednio hackując ref.Wszystko, co możesz zrobić, to użyć repozytorium, aby zmienić swoje źródło, tak jak chcesz, i zatwierdzić to jako zmianę. – sibaz

+0

Po dokładniejszym zbadaniu mogę zobaczyć, że możliwe jest usunięcie commit z historii przy użyciu svnadmin, ale zdecydowanie odradzam. Zobacz http://stackoverflow.com/questions/5566327/delete-all-traces-of-a-svn-commit – sibaz

1

Chociaż podane sugestie mogą już działać dla niektórych osób, nie działa to w moim przypadku. Podczas przeprowadzania scalania użytkownicy pod numerem rev 1443, którzy aktualizują się do rev 1445, nadal synchronizują wszystkie pliki zmienione w 1444, mimo że są równe 1443 z scalenia. Potrzebowałem użytkowników końcowych, aby w ogóle nie widzieli aktualizacji.

Aby całkowicie ukryć zatwierdzenie, można utworzyć nową gałąź 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> 

ten pracował dla mnie, być może będzie to pomocne dla kogoś innego tam =)

25

Najpierw przywrócić kopię roboczą do 1943

> svn merge -c -1943 . 

drugie, należy sprawdzić, co jest o być zaangażowanym.

> svn status 

trzecie, popełnić wersja 1945.

> svn commit -m "Fix bad commit." 

czwarte, spojrzeć na nowego dziennika.

> 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. 
------------------------------------------------------------------------ 
1
svn merge -c -M PATH 

To uratowało mi życie.

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

0

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

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

Komenda svnrdump wykonuje taką samą funkcję jak svnadmin dump, lecz działa na zdalnym repo.

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