Przywracanie pojedynczego pliku w SVN do określonej wersji

182

Mam plik pokazany poniżej w repozytorium SVN, który chciałbym przywrócić do poprzedniej wersji. Jak to zrobić w SVN? Chcę tylko zmienić ten konkretny plik na starszą wersję, a nie całe repozytorium.

Dzięki.

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial
Gökhan Sever
źródło
kiedy powiedziałeś: cofnij, co miałeś na myśli, 7 lat temu, lol
Kalpesh Soni

Odpowiedzi:

181

Jeśli chcesz tylko stary plik w kopii roboczej:

svn up -r 147 myfile.py

Jeśli chcesz wycofać, zobacz to „ Jak powrócić do starszej wersji naszego kodu w wersji subversion? ”.

Eric Hauser
źródło
8
ale przy następnej aktualizacji otrzyma plik, którego nie chciałeś odzyskać ...: S
andygoestohollywood
2
jeśli nie chcesz go odzyskać, svn zatwierdź ten plik, aby umieścić żądaną wersję w repozytorium
Packet Tracer
14
Prawdopodobnie nie robi to tak, jak chciał pytający. Dzięki temu kopia robocza jest czysta i nie można jej zatwierdzić w stanie, w jakim się znajduje, a „aktualizacja svn” bez określonego numeru wersji spowoduje pobranie najnowszej niechcianej wersji.
CXJ
1
Jak mogę następnie zatwierdzić cofnięty plik?
marcio
2
Nie jest to do końca właściwe, ponieważ, jak wspomina CXJ, nie ma sposobu na zatwierdzenie zaktualizowanego pliku. Prawdopodobnie chcesz to zrobić, jak mówi Mitch Dempsey (zauważ jednak, że --force wymusza nadpisanie pliku): svn export --force -r 147 myfile.py myfile.py
avejidah
76

svn cat ma również wersję arg!

svn cat -r 175 mydir/myfile > mydir/myfile

Nigdy więcej nie śpij
źródło
20
To zdecydowanie najlepsza odpowiedź na stronie. Pozostawia zmieniony plik w stanie, który można zatwierdzić.
dotancohen
to nie działa, gdy
wklejasz
haha patrząc na to z powrotem, idk o jakim kontekście myślałem, kiedy pisałem. Nie pamiętam To wydaje się nonsensowne.
ahnbizcad
Jest to proste i łatwe, gdy po prostu chcesz cofnąć zmiany i przywrócić plik do stanu przed zatwierdzeniem bez żadnych technicznych szczegółów kontroli wersji.
Anonimowy
57
svn revert filename 

powinno to przywrócić pojedynczy plik.

gwiazda
źródło
4
O co chodzi z pozostałymi odpowiedziami z dłuższymi poleceniami? Dzięki.
masterxilo,
Zapraszamy. Nie mam pojęcia o co chodzi z innymi odpowiedziami. Lol
thestar
13
Powraca to do której wersji? Doc mówi, że po prostu zastępuje najnowszą wersją repo. Pytanie, jak przywrócić wcześniejszą wersję.
tgkprog
1
Powraca to do najnowszej wersji repo. Jeśli czytasz opis pytań, wygląda na to, że szukał sposobu na przywrócenie pojedynczego pliku, a nie całego katalogu.
thestar
5
Wierzę, że to wszystko niszczy twoją kopię roboczą, „przywracając” ją z powrotem do głowy. Lub do której kiedykolwiek został sprawdzony. potwierdź, wykonując plik VER aktualizacji svn -r, a następnie przywróć svn.
Gerard ONeill,
50

W przypadku pojedynczego pliku możesz wykonać:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

Możesz to zrobić, svn revert <file>ale przywróci to tylko ostatnią kopię roboczą.

Mitch Dempsey
źródło
2
eksportować, następnie wkleić do lokalnej kopii, a następnie zatwierdzić ponownie?
tgkprog 17.09.13
1
@tgkprog to jeden ze sposobów, aby to zrobić, tak
Mitch Dempsey,
@tgkprog i jaki jest „preferowany” sposób?
hbogert
Nie mam pojęcia, ale to mi się udało: wyeksportowałem poprzednią wersję. Otwarty w notatniku, skopiowany, wklejony do pliku roboczego. Zobowiązałem się do tego z komentarzem na temat której wersji i dlaczego. Narzędzia interfejsu użytkownika mogą mieć lepszy sposób.
tgkprog
21

Jak dotąd wszystkie odpowiedzi tutaj wydają się mieć znaczące wady, są skomplikowane (trzeba znaleźć identyfikator URI repo) lub nie robią tego, o co prawdopodobnie pytało pytanie: Jak przywrócić Repo do stanu roboczego dzięki tej starszej wersji plik .

svn merge -r head:[revision-number-to-revert-to] [file-path]jest IMO najczystszym i najprostszym sposobem na zrobienie tego. Pamiętaj, że przywracanie usuniętego pliku nie działa w ten sposób [1]. Zobacz także następujące pytanie: Lepszy sposób na przywrócenie poprzedniej wersji pliku SVN?

[1] W tym celu svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn upzobacz także Jaki jest prawidłowy sposób przywrócenia usuniętego pliku z SVN?

Michel Müller
źródło
Chciałbym zauważyć, że przynajmniej dla mojej wersji Subversion svn mergez jakiegoś powodu nie przyjmuje wielu plików jako argumentu. W tym przypadku wydaje się, że nic nie robi (bez komunikatu o błędzie).
Wrzlprmft
Ale moje polecenie nadal działa, powtarzając je dla każdego pliku, prawda?
Michel Müller,
Tak, rzeczywiście.
Wrzlprmft
1
Zgodził się, że to jest najczystsze.
KevinG
13

Najlepszym sposobem jest:

svn merge -c -RevisionToUndo ^/trunk

Spowoduje to cofnięcie wszystkich plików wersji niż po prostu przywrócenie plików, których nie chcesz cofać. Nie zapomnij o myślniku ( -) jako prefiksie zmiany.

svn revert File1 File2

Teraz wprowadź zmiany z powrotem.

Khmarbaise
źródło
9

Chcesz robić

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

Gdy to zrobisz, będziesz mieć tę wersję pliku w stanie do zatwierdzenia. Zatwierdź plik.

Jennifer Elyse
źródło
7

Odkryłem, że łatwo jest to zrobić za pomocą svn catpolecenia, abyś nawet nie musiał określać wersji.

svn cat mydir/myfile > mydir/myfile

Prawdopodobnie nie spowoduje to przywrócenia danych i-węzłów (metadanych), takich jak znaczniki czasu.

Joseph Coco
źródło
następnie zatwierdz plik, aby
trafił
3
To działało dla mnie lepiej niż aktualizacja. Ponieważ aktualizacja nie pozwala zatwierdzić modyfikacji dokonanej w tym pliku. (svn 1.8.3)
fe_lix_
7

zaskoczony, nikt o tym nie wspominał

bez znalezienia numeru wersji możesz to napisać, jeśli popełniłeś coś, co chcesz przywrócić, to nie zadziała, jeśli zmieniłeś jakiś inny plik, a plik docelowy nie jest plikiem ostatnio zmienionym

svn merge -r HEAD:PREV file
Kalpesh Soni
źródło
jeśli masz jakieś uwagi, przed wprowadzeniem zmian omów je tutaj?
Kalpesh Soni
1
Czy scenariusz w pytaniu nie wymaga scalenia ostatniej zmiany, tak abyśmy zastosowali zmiany potrzebne do przejścia z HEAD na PREV?
Nick Russo,
4
Polecenie powinno wyglądać svn merge -r HEAD:PREV filetak, jak powiedział @Nick Russo
Heinz
4

Jeśli to tylko kilka plików i jeśli używasz Tortoise SVN, możesz zastosować następujące podejście:

  1. Kliknij prawym przyciskiem myszy plik źródłowy i wybierz „TortoiseSVN” -> „Pokaż dziennik”.
  2. Kliknij prawym przyciskiem myszy wersję w dzienniku i wybierz „Zapisz wersję w ...”.
  3. Pozwól starej wersji zastąpić bieżący plik.
  4. Zatwierdź zastąpiony plik źródłowy.
Elling
źródło
Zapisuje to nowy niewersjonowany plik, taki jak plik-xxxx, w którym xxxx jest starym numerem wersji. Co robimy dalej? usunąć nową wersję (np. HEAD), zmienić nazwę nowego pliku, dodać, zatwierdzić?
Heinz
Nie, nie zapisuj go z numerem wersji w nazwie pliku. Zapisz go pod dokładnie taką samą nazwą, jak bieżąca wersja tego samego pliku (innymi słowy, w nazwie pliku nie ma xxxx). Następnie po prostu wykonaj zwykłe zatwierdzenie po tym.
Elling,
4

Po prostu dodałem odpowiedź @Mitch Dempsy, ponieważ nie mam jeszcze wystarczającej liczby przedstawicieli, aby móc komentować.

svn export -r <REV> svn://host/path/to/file/on/repos --force

Dodanie opcji --force spowoduje zastąpienie lokalnej kopii eksportem, a następnie możesz wykonać polecenie svn, aby wypchnąć ją do repozytorium.

Krystyna
źródło
i to jest najlepsza odpowiedź :)
Zgr3doo
dlaczego to najlepsza odpowiedź? nie zarządza historią „po svn”
Jason S
2

Alternatywną opcją dla pojedynczego pliku jest „zastąpienie” bieżącej wersji pliku starszą wersją:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

Ma to dodatkową funkcję, że niepożądane zmiany nie pojawiają się w dzienniku dla tego pliku (tj. Svn log file.ext).

Robert Leland
źródło
1

Jeśli chcesz wycofać pojedynczy plik z konkretnej wersji i móc zatwierdzić, wykonaj następujące czynności:

svn merge -c - [OldRev #] [Nazwa pliku]

to znaczy. svn merge -c -150 myfile.py

Zwróć uwagę na ujemny numer wersji

Olmstov
źródło
-1
sudo svn revert filename

jest to lepszy sposób na przywrócenie pojedynczego pliku

mallikarjun SK
źródło
1
Naprawdę mam nadzieję, że nigdy nie zbliżysz się do maszyny produkcyjnej z uprawnieniami sudoer.
David Lakatos,