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 forget
lub hg remove -Af
usunę bez usuwania z katalogu, ale moje pytanie dotyczy błędu, który popełniłem, w przeciwieństwie do fajnego przemyślenia akcji.
Odpowiedzi:
Najpierw użyj,
hg grep
aby 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, uruchomhg 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.źródło
hg log -I '**file.ext'
Cytat z komentarza:
W takim przypadku wystarczy zaktualizować katalog roboczy do poprzedniej wersji:
Zwróć uwagę na ujemny numer wersji. Jeśli usuniętych plików nie ma w poprzedniej wersji, możesz je znaleźć za pomocą:
źródło
Cóż, to zadziałało dla mnie.
źródło
Dla Mercurial 1.6 i nowszych
Jeśli znasz nazwę usuniętego pliku, możesz łatwo znaleźć jego wersję za pomocą:
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):
Możesz zamiast tego użyć wzorca nazwy pliku, aby dostosować się do tego, co wiesz, na przykład możesz użyć
**/NAME.c
do 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 .źródło
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:
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
.źródło
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.źródło
hg rollback
nie odzyska usuniętego pliku, ponieważ usunięcie pliku nie jest częścią transakcji zatwierdzania.Zatwierdzone wersje można usunąć za pomocą
hg strip
polecenia 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.
źródło
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.
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
.źródło
Poniższe zadziałały dla mnie.
(Opcjonalnie, aby przywrócić wszystkie pliki)
źródło