2009-05-02 14 views
418

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

Używam "anksvn" na vs08.

Mam wersję, którą chcę na moim komputerze, ale zatwierdzenie się nie udaje; Otrzymuję komunikat: "Zatwierdzenie nie powiodło się, plik lub katalog jest nieaktualny."

Mam również klienta subversion na moim komputerze.

Odpowiedz

686

Zasadniczo musisz "scalić wstecz" - zastosować różnicę między bieżącą a poprzednią wersją do aktualną wersję (tak, aby skończyła się kopia robocza wyglądająca jak stara wersja), a następnie zatwierdzić ponownie. Tak na przykład, aby przejść od rewizji 150 (bieżący) z powrotem do rewizji 140:

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

Subversion Red Book posiada good section about this.

+3

ale scalenie nie zastąpi moich zmian i nowej wersji. –

+1

Jakie zmiany? Wszelkie zmiany, których nie chcesz w swojej kopii roboczej, można po prostu usunąć przy pomocy polecenia svn revert. Zatwierdzone zmiany zostaną "cofnięte" przez to scalenie. –

+71

Jeśli używasz TortoiseSVN, kliknij plik prawym przyciskiem myszy wybierz Scal, a następnie Scal zakres wersji. W polu dziennika wpisz 140-150 i kliknij pole wyboru Odwróć. Następnie zatwierdz jak zwykle. Spowoduje to wykonanie tej samej operacji, co przykład Jona. – DavGarcia

0

Zsynchronizuj ze starszą wersją i zatwierdz ją. To powinno wystarczyć.

Here's także wyjaśnienie cofania zmian.

4

prawym przyciskiem myszy na najwyższym hierarchii chcesz przywrócić >>Revert lub Revert to Revision

156

powodem, że nie może nic zrobić bezpośrednio z dobrej kopii masz na komputerze, jest to, że jego .svn foldery wiedzieć że jest to kod z przeszłości, więc wymaga aktualizacji. Ale możesz tylko dokonać zmian na czele historii subversion.

Można użyć

svn update -r <earlier_revision_number>

sprawdzić różne starsze wersje projektu, aż do znalezienia odpowiedniego numeru wersji, od swojej dobrej wersji. Po znalezieniu aktualizacji zaktualizuj ją do najnowszej wersji (head), a następnie zastosuj svn merge, jak sugerowano powyżej.

Jeśli naprawdę nie może go znaleźć, a potrzeba popełnić kopię na komputerze, a następnie dostać świeżą aktualizację do najnowszej wersji, a następnie skopiować swoje „dobre” w wersji na wierzchu (bez folderów .svn!). Usuń wszystkie pliki, które nie znajdowały się w dobrej kopii z folderów i subversion, i zatwierdź to, co masz teraz.

23

Standardowy sposób wykorzystania scalania do cofnięcia całego odprawy działa świetnie, jeśli tego chcesz. Czasami jednak wszystko, co chcesz zrobić, to przywrócić pojedynczy plik. Nie ma na to żadnego uzasadnionego sposobu, ale jest hack:

  1. Znajdź żądaną wersję za pomocą logu svn.
  2. Użyj SVN za eksport komenda:

    svn export http://[email protected]/tmp/filename

(gdzie 123 jest numerem rewizji w dobrej wersji pliku.) Następnie przenieś lub skopiuj ten pojedynczy plik, aby zastąpić stary. Sprawdź zmodyfikowany plik i gotowe.

+0

Używając Tortoise-svn I można kliknąć prawym przyciskiem myszy na pojedynczy plik i połączyć go. Powinien być sposób na zrobienie tego również za pomocą 'svn'? –

+9

'svn cat -r 123 ścieżka-w-twojej-kopii roboczej> ścieżka-w-twojej-pracy-kopia' – dash17291

+0

dla mnie! świetny –

28

Wystarczy użyć tej linii

svn update -r yourOldRevesion

Można znać swoją aktualną wersję za pomocą:

svn informacji

+10

To nie rozwiązuje problemu. Zamiast tego generuje stan, w którym pytający był w chwili zadawania pytania. –

5

myślę to jest najbardziej odpowiednie:

Wykonaj scalenie wstecz, na przykład, jeśli zatwierdzony kod zawiera wersję od rev 5612 do 5616, po prostu scal ją w tył. Działa w moim końcu.

Na przykład:

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

To będzie zawierać kod połączonego z powrotem do dawnej wersji, a następnie można go popełnić.

8

trochę bardziej old-school

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

wtedy zwykle

svn diff 
svn commit 
3

To, co zrobiłem i pracował dla mnie.

Chcę cofnąć zmiany w wielu zatwierdzeniach, które wykonałem przez pewien czas i chcę przejść do poprzedniego punktu zatwierdzenia.

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

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

Wystarczy przejrzeć kod i zatwierdzić.

-1

Następujące pracował dla mnie.

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

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

  2. Grep wszystkie linie, aby uzyskać nowo dodane i zignorowane pliki.

  3. Wymień te na //.

  4. i rm -rf wszystkie linie.

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

1

Prawo kliknij projekt> Zamień> Przegląd lub URL> Wybierz konkretne zmiany, które chcesz przywrócić.

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

1

Większość poprzednich odpowiedzi używa odwrotnego scalania, co zwykle jest właściwą odpowiedzią. Jest jednak jedna sytuacja (która właśnie mi się przytrafiła), w której nie jest.

Przypadkowo zmieniono plik z końcówkami linii Unix na zakończenia linii DOS po wprowadzeniu drobnej zmiany i zatwierdziłem ją. Można to łatwo cofnąć, zmieniając zakończenia linii i ponownie zatwierdzając lub odwrotnie, ale powoduje to, że svn blame wyświetla moją edycję jako źródło każdej linii pliku. (. Co ciekawe, TortoiseSVN na Windows nie uzyskać wpływ na to, tylko z wiersza poleceń svn blame)

Jeśli chcesz zachować historię jak donosi svn blame, myślę, że trzeba wykonać następujące czynności:

  • Usuń plik i zatwierdz.
  • W repozytorium skopiuj poprzednią dobrą kopię pliku do głowy i zatwierdz.
  • Przywróć wszelkie 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 trochę kodu ilustrującego kroki. Załóżmy, że xxx jest numerem wersji ostatniej dobrej kopii.

svn rm svn+ssh://path/to/file 
svn copy svn+ssh://path/to/[email protected] svn+ssh://path/to -m"Restore good copy" 
svn update 
<restore the edits> 
svn commit -m"Restore edits" 

Należy pamiętać, że w przypadku kopii w repozytorium miejscem docelowym musi być katalog, a nie nazwa pliku.

Powiązane problemy