Jaki jest właściwy sposób przywrócenia usuniętego pliku z SVN?

119

Usunąłem plik z repozytorium i teraz chcę go przywrócić. Najlepsze, co potrafię, to:

  • aktualizacja do wersji przed usunięciem
  • skopiuj pliki w inne miejsce
  • aktualizacja do głowy
  • skopiuj pliki z powrotem
  • Dodaj ich
  • popełnić

To po prostu brzydko pachnie i powoduje utratę całej historii. Musi być lepszy sposób na zrobienie tego. Szukałem już w książce SVN, ale nic nie znalazłem, a teraz przeglądam listę tagów SVN.

BCS
źródło
4
Z pewnością odpowiedź Tukushana jest poprawną bezpośrednią odpowiedzią na twoje pytanie i powinna zostać zaakceptowana?
James McCormack
@JamesMcCormack: zobacz NB w jego odpowiedzi.
BCS
2
Wskazówka, jeśli usunąłeś plik i nie zatwierdziłeś jeszcze zmiany, po prostu kliknij prawym przyciskiem myszy, a aktualizacja przywróci go.
Hammad Khan

Odpowiedzi:

57

Użyj scalania svn:

svn merge -c -[rev num that deleted the file] http://<path to repository>

A więc przykład:

svn merge -c -12345 https://svn.mysite.com/svn/repo/project/trunk
             ^ The negative is important

Dla TortoiseSVN (myślę ...)

  • Kliknij prawym przyciskiem myszy w Eksploratorze, przejdź do TortoiseSVN -> Scal ...
  • Upewnij się, że wybrana jest opcja „Scal zakres wersji”, kliknij przycisk Dalej
  • W polu tekstowym „Zakres wersji do scalenia” określ wersję, która usunęła plik
  • Zaznacz pole wyboru „Odwróć scalanie” i kliknij Dalej
  • Kliknij Scal

Jest to jednak całkowicie niesprawdzone.


Edytowane przez OP : Działa to na mojej wersji TortoiseSVN (starego rodzaju bez przycisku „Następny”)

  • Przejdź do folderu, z którego zostały usunięte
  • Kliknij prawym przyciskiem myszy w Eksploratorze, przejdź do TortoiseSVN -> Scal ...
  • w sekcji Od wprowadź wersję, która spowodowała usunięcie
  • w sekcji Do wprowadź wersję przed usunięciem.
  • Kliknij „scal”
  • popełnić

Sztuczka polega na połączeniu wstecz . Uznanie dla sean.bright za wskazanie mi właściwego kierunku!


Edycja: używamy różnych wersji. Metoda, którą opisałem, działała doskonale z moją wersją TortoiseSVN.

Warto również zauważyć, że jeśli było wiele zmian w zatwierdzeniu, które scalasz odwrotnie, będziesz chciał cofnąć te inne zmiany po zakończeniu scalania przed zatwierdzeniem. Jeśli tego nie zrobisz, te dodatkowe zmiany również zostaną cofnięte.

Sean Bright
źródło
Pracuję w systemie Windows i nie mam wersji SVN dla CLI. czy wiesz, jak to zrobić ortoiseSVN?
BCS
Żółw ma opcję „scal” w menu wyświetlanym po kliknięciu prawym przyciskiem myszy. Ma pola do wypełnienia dla rew. Również „Bieg na sucho”, aby sprawdzić, czy wszystko zostało ustawione prawidłowo. I pamiętaj, wynik nie liczy się, dopóki go nie popełnisz. Możesz cofnąć, jeśli wszystko pójdzie na marne.
gbarry
Powiedziałbym, że OP ma starszą wersję Tortoise. Nowszy ma inne (gorsze) okno dialogowe scalania
1800 INFORMACJE
Nie widziałem jeszcze ŻADNEGO systemu scalania, który nie był do niczego. Tekst, pliki, książki, dokumenty Worda, fuj. Myślę, że to nie jest problem do rozwiązania. OTOH rzeczy mogą być mniej lub bardziej do niczego. :)
BCS
1
Jeśli przywrócisz kilka plików, a następnie cofniesz, jeden z przywróceń jest nieodwracalny. Auć! Myślę, że właśnie coś zraniłem.
BCS
176

Problem z robieniem scalania svn, jak zasugerował Sean Bright, polega na tym, że przywraca inne zmiany wprowadzone w tej samej wersji, co usunięcie. Kopia svn to bardziej ukierunkowana operacja, która wpłynie tylko na usunięte pliki.

Używając Tortoise SVN możesz wskrzesić plik, który został usunięty z katalogu kopii roboczej oraz z późniejszych wersji SVN, poprzez kopię svn w następujący sposób:

  • Przejdź do folderu kopii roboczej, który poprzednio zawierał plik.
  • Kliknij prawym przyciskiem myszy folder w Eksploratorze, przejdź do TortoiseSVN -> Pokaż dziennik.
  • Kliknij prawym przyciskiem myszy numer wersji tuż przed wersją, która usunęła plik i wybierz „Przeglądaj repozytorium”.
  • Kliknij prawym przyciskiem myszy usunięty plik, wybierz „Kopiuj do kopii roboczej ...” i zapisz.

Usunięty plik będzie teraz znajdował się w folderze kopii roboczej. Aby ponownie dodać go z powrotem do SVN, kliknij prawym przyciskiem myszy przywrócony plik i wybierz Zatwierdź SVN.

Uwaga: Ta metoda zachowa poprzednią historię przywracanego pliku, jednak aby zobaczyć poprzednią historię w dzienniku TortoiseSVN, musisz upewnić się, że opcja „Zatrzymaj przy kopiowaniu / zmianie nazwy” jest odznaczona w oknie dialogowym Komunikaty dziennika.

tekumara
źródło
26
Można to również wykonać bezpośrednio na serwerze, przydatne, jeśli usunięte pliki lub foldery były dość duże: svn cp -r 1993 http://example.com/svn/trunk/path@1993 http://example.com/svn/trunk/path
Craig
To jest właściwy sposób, aby to zrobić. Właśnie wypróbowałem z TortoiseSVN 1.8.1 i działa zgodnie z zaleceniami.
Dr Gianluigi Zane Zanettini
Idealny!! Proste i skuteczne. Dzięki za rozwiązanie
Hunter,
Ta metoda znacznie ułatwiła mi przywrócenie pliku do gałęzi podrzędnej, która została usunięta z gałęzi nadrzędnej. Być może był sposób, aby to zrobić merge, ale nie odkryłem tego.
arr_sea,
„Tuż przed” w kroku 3 jest ważne. W kroku 4 Tortoise wciąż narzekał, że plik już istnieje, mimo że usunąłem go za pomocą funkcji usuwania systemu Windows. Najpierw musiałem zaktualizować moją kopię roboczą. (Mój kolega usunął kilka plików za pomocą funkcji usuwania Tortoise, a następnie zatwierdził zmiany.) TortoiseSVN 1.8.1.
leqid
16

Użyj funkcji kopiowania Tortoise SVN, aby cofnąć zatwierdzone zmiany:

  1. Kliknij prawym przyciskiem myszy folder nadrzędny zawierający usunięte pliki / folder
  2. Wybierz „pokaż dziennik”
  3. Wybierz i kliknij prawym przyciskiem wersję, przed którą zmiany / usunięte zostały wprowadzone
  4. Wybierz „przeglądaj repozytorium”
  5. Wybierz plik / folder, który chcesz przywrócić i kliknij prawym przyciskiem myszy
  6. Wybierz „kopiuj do”, co spowoduje skopiowanie plików / folderów do wersji głównej

Mam nadzieję, że to pomoże

Mukul Joshi
źródło
13

Wydaje się, że zawsze używam kopiowania svn jako operacji na serwerze, więc nie jestem pewien, czy działa z dwiema ścieżkami roboczymi.

Oto przykład przywracania usuniętego pliku do lokalnej kopii roboczej projektu:

svn copy https://repos/project/modules/module.js@3502 modules/module.js

Będąc w katalogu projektu. Działa to również w przypadku przywracania całych katalogów.

NullPoiиteя
źródło
2
+1 Kopia @ zadziałała. Wydaje się, że copy -r nie działa przy używaniu CollabNet svn 1.6.17 pod Mac OSX.
Gray
2
Również zastosowana wersja powinna być wersją tuż przed usunięciem.
Gray
6

Jeśli używasz Tortoise SVN, powinieneś być w stanie cofnąć zmiany z samej wersji do kopii roboczej (efektywnie wykonując scalanie odwrotne), a następnie wykonać kolejne zatwierdzenie, aby ponownie dodać plik. Kroki, które należy wykonać:

  1. Przejdź do folderu w kopii roboczej, w którym usunięto plik.
  2. Przejdź do przeglądarki repo.
  3. Przejdź do wersji, w której usunąłeś plik.
  4. Na liście zmian znajdź usunięty plik.
  5. Kliknij plik prawym przyciskiem myszy i przejdź do „Cofnij zmiany z tej wersji”.
  6. Spowoduje to przywrócenie pliku do kopii roboczej, zachowując historię.
  7. Zatwierdź plik, aby dodać go z powrotem do repozytorium.
davogones
źródło
OK, w takim razie pytanie brzmiało, jak zrobić to, co właśnie opisałeś. (Odpowiedź: użyj scalania wstecz)
BCS
1
Mówiłem o tym, jak to zrobić w Tortoise SVN. Dodam więcej szczegółów.
davogones
5

Najłatwiejszym sposobem, w jaki mogłem przywrócić pliki i nie stracić historii wersji, jest użycie kopii SVN , powyższy przykład scalania wydaje mi się bardziej złożonym sposobem osiągnięcia tego samego. Dlaczego zachodzi potrzeba scalenia, jeśli po prostu chcesz przywrócić wersję?

W tym przypadku używam następujących i działa całkiem dobrze.

svn copy -m 'restoring file' -r <rev_number_file_to_restore> http://from/file.cs http://pathTo/file.cs

Wydaje się, że zawsze używam svn copyjako operacji serwera, więc nie jestem pewien, czy działa z dwiema ścieżkami roboczymi.

Daniel Honig
źródło
3
Zalecanym podejściem jest SVN COPY. Składnia jest bardzo prosta: svn copy [URL SVN] @ [WERSJA # GDZIE ISTNIEJE PLIK] [LOKALNA ŚCIEŻKA DO PRZYWRÓCENIA DO] z visualsvn.com/support/svnbook/branchmerge/basicmerging . Właśnie tego użyłem.
amit
To ma dla mnie najwięcej sensu, ja też używam tego podejścia
Dmitrij Paszkiewicz
4

Z SVN dla żółwia :

Jeśli jeszcze nie zatwierdziłeś zmian, możesz przywrócić folder nadrzędny, z którego usunąłeś plik lub katalog.

Jeśli już zatwierdziłeś usunięty plik, możesz użyć przeglądarki repozytorium, przejść do wersji, w której plik nadal istniał, a następnie użyć polecenia Kopiuj do ... z menu kontekstowego. Wprowadź ścieżkę do swojej kopii roboczej jako miejsce docelowe, a usunięty plik zostanie skopiowany z repozytorium do kopii roboczej.

VonC
źródło
miły. Spróbuję tego następnym razem.
BCS
1

Powinieneś móc po prostu wyewidencjonować jeden plik, który chcesz przywrócić. Spróbuj na przykład svn co svn://your_repos/path/to/file/you/want/to/restore@revgdzie revjest ostatnia wersja, w której plik istniał.

Musiałem to zrobić dokładnie jakiś czas temu i jeśli dobrze pamiętam, użycie -ropcji svnnie zadziałało; Musiałem użyć :revskładni. (Chociaż mogłem zapamiętać to wstecz ...)

David Z
źródło
Nie tego chcę. Chcę załatać plik z powrotem do repozytorium i powiadomić SVN, że to ten sam plik.
BCS