Jak mogę odzyskać usunięty plik w Mercurial (jeśli w ogóle)?

100

Przypadkowo, używając GUI zamiast CLI, usunąłem każdy plik w projekcie Mercurial.

Wyzdrowiałem z Revert ok i straciłem część pracy, którą jako posiadam wehikuł czasu mogłem łatwo odzyskać. Ale czy istnieje sposób na usunięcie / przywrócenie takich plików? Przeszukałem instrukcję i przeszukałem google, ale nic nie widzę. Jakieś wtyczki?

Prawdopodobnie odpowiadam tutaj na własne pytanie, ale pliki zostały usunięte z katalogu i nie znalazły się w koszu do odzyskania, więc zakładam, że usunięcie jest nieodwracalne?

ps Wiem to hg forgetlub hg remove -Afusunę bez usuwania z katalogu, ale moje pytanie dotyczy błędu, który popełniłem, w przeciwieństwie do fajnego przemyślenia akcji.

PurplePilot
źródło
1
powinieneś być w stanie pobrać starszą wersję i być w porządku (oczywiście działa to tylko w przypadku, gdy nie przepisałeś historii)
cofnij
problem polegał na tym, że zatwierdziłem, wprowadziłem zmiany, R (usunięto). Więc po tej sekwencji tak, otrzymałem poprzednie zatwierdzenie, więc wróciłem do tego, a ponieważ mam kopię zapasową w postaci wehikułu czasu, mogłem pobrać ostatnie zmiany, a następnie dodać je, a następnie zatwierdzić. Jednak gdybym nie miał kopii zapasowej, zmiany zostałyby utracone.
PurplePilot
1
Powiązane pytanie, które pozwala wyszukiwać tylko nazwy plików (szybko): stackoverflow.com/questions/1013550/…
Michael Pryor

Odpowiedzi:

152

Najpierw użyj, hg grepaby znaleźć usunięty plik, który chcesz odzyskać. Dane wyjściowe tego polecenia pokażą ostatnią wersję, dla której plik był obecny, oraz ścieżkę do usuniętego pliku. Po drugie, uruchom hg revert -r <revision number> <path to deleted file> Usunięty plik będzie teraz w twojej kopii roboczej, gotowy do ponownego wprowadzenia do głowy.

BungleFeet
źródło
5
dobrze mi działało, dzięki. szukał odpowiedzi na pytanie „jak przywrócić plik, który celowo usunąłem?”
nc.
z zaćmienia można to zrobić, klikając prawym przyciskiem myszy plik Wybierz zespół -> Przywróć
Emil
3
Innym sposobem znalezienia wersji zawierającej plik jesthg log -I '**file.ext'
mpen
2
Tylko do Twojej wiadomości: Chcesz numer rewizji zatwierdzenia, który nadal ma plik, a NIE ten, który go usunął!
Lukas Knuth
8

Cytat z komentarza:

Założyłem repozytorium, zatwierdziłem wszystko, usunąłem i ponownie zatwierdziłem

W takim przypadku wystarczy zaktualizować katalog roboczy do poprzedniej wersji:

$ hg update -C -r-2

Zwróć uwagę na ujemny numer wersji. Jeśli usuniętych plików nie ma w poprzedniej wersji, możesz je znaleźć za pomocą:

$ hg log -v
mrucci
źródło
5

Cóż, to zadziałało dla mnie.

hg revert -r revision pathToTheFile
Shweta
źródło
4

Dla Mercurial 1.6 i nowszych

Jeśli znasz nazwę usuniętego pliku, możesz łatwo znaleźć jego wersję za pomocą:

hg log -r "removes('NAME.c')"

To da ci wersję, w której plik o nazwie NAME.c (w katalogu głównym) zostanie usunięty.

Następnie możesz przywrócić plik do poprzedniej wersji za pomocą (podobnie jak inne odpowiedzi):

hg revert -r <revision number> <path to deleted file>

Możesz zamiast tego użyć wzorca nazwy pliku, aby dostosować się do tego, co wiesz, na przykład możesz użyć **/NAME.cdo wyszukiwania we wszystkich katalogach. Możesz o tym przeczytać w rozdziale Wzory nazw plików . I użyj tego linku, aby dowiedzieć się o nowych specyfikacjach revset .

PhoneixS
źródło
1

Dodatek do zaakceptowanej odpowiedzi - jest to szybsze rozwiązanie, jeśli chcesz cofnąć wszystkie usunięcia w zatwierdzeniu. Usunąłem duży folder zawierający kilkaset plików i zrobiłem to hg addremove, co wcale nie było moim zamiarem, więc musiałem cofnąć wszystkie te usunięcia.

Korzystanie z funkcji Znajdź usunięte pliki w historii repozytorium Mercurial? + xargs + tr, przywróć wszystkie usunięcia wersji -3 do wersji z rewizji -4:

hg log -r -3 --template "{rev}: {file_dels}\n" | tr ' ' '\n' | xargs hg revert -r -4 

Zauważ, że to się nie powiedzie, jeśli którykolwiek z twoich plików ma spacje w nazwie; Witryna http://hgbook.red-bean.com/read/customizing-the-output-of-mercurial.html nie zawiera obecnie żadnych szablonów, w przypadku których {file_dels}jest podzielona według \n.

keflavich
źródło
0

Możesz cofnąć ostatnie zatwierdzenie repozytorium za pomocą hg rollback. Dostępny jest tylko jeden poziom przywracania, więc jeśli wykonałeś usunięcie z więcej niż jednym zatwierdzeniem, nie spowoduje to całkowitego cofnięcia zmiany. Działa to tylko w lokalnym repozytorium, więc jeśli wypchnąłeś, nie będziesz w stanie cofnąć tego w zdalnym repozytorium.

ataylor
źródło
1
Nie, to nie działa. Używam komputera Mac z rozwiązaniem Mercurial Distributed SCM (wersja 1.4.1 + 20091201). Skonfigurowałem repozytorium, zatwierdziłem wszystko, usunąłem, a następnie zatwierdziłem ponownie, ale to tylko przywraca listę plików oznaczonych jako R (usunięte), ale w rzeczywistości nie przywraca plików. Jeśli oznaczę pliki jako R (emulowane) i Rollback przed zatwierdzeniem, również nic się nie dzieje.
PurplePilot
Po zakończeniu przywracania hg repozytorium zostanie przywrócone, ale w bieżącym katalogu roboczym nadal będą znajdować się zmiany. Po prostu powiedz hg, aby wykonał czystą aktualizację wycofanej wersji, teraz na wskazówce: hg up -C.
ataylor
1
hg rollbacknie odzyska usuniętego pliku, ponieważ usunięcie pliku nie jest częścią transakcji zatwierdzania.
mrucci
4
Zgadza się. Jeśli chcesz uzyskać zmiany, które nie zostały zatwierdzone przed usunięciem, zostaną utracone.
ataylor
0

Zatwierdzone wersje można usunąć za pomocą hg strippolecenia udostępnianego przez rozszerzenie mq (Mercurial Queues). To powinno zwrócić Twoje pliki.

Zrób kopię zapasową przed wypróbowaniem tego, ponieważ zmieni to bazę danych zestawów zmian Mercurial.

daniel kullmann
źródło
0

Poniższa metoda jest prosta i tak głupia, że ​​nie może się nie udać. Jeśli usunąłeś lub zmieniłeś nazwę wielu plików, wszystko będzie w porządku.

hg clone mydirectory mydirectory1

a teraz zaczynasz mc (lub Far Manager) i porównujesz to, czym było, z tym, czym się stało.

kiedy to się skończy, po prostu usuń mydirectory1.

18446744073709551615
źródło
0

Poniższe zadziałały dla mnie.

hg revert -r <Revision Number> <File Name>

(Opcjonalnie, aby przywrócić wszystkie pliki)

hg revert -r <Revision Number> --all
Naveen Kumar V
źródło