Odrzucić wszystko i otrzymać czystą kopię najnowszej wersji?


159

Przenoszę proces kompilacji do użycia Mercurial i chcę przywrócić katalog roboczy do stanu wersji końcówki. Wcześniejsze uruchomienia procesu kompilacji zmodyfikowały niektóre pliki i dodały pliki, których nie chcę zatwierdzać, więc mam lokalne zmiany i pliki, które nie są dodawane do repozytorium.

Jaki jest najłatwiejszy sposób na pozbycie się tego wszystkiego i uzyskanie czystego katalogu roboczego z najnowszą wersją?

Obecnie robię to:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

ale wydaje się, że powinien być prostszy sposób.

Chcę zrobić to samo, co usunąć repozytorium, zrobić nowy klon i zaktualizować. Ale repozytorium jest zbyt duże, aby było wystarczająco szybkie.


1
Czy „(usuń zawartość ...)” jest komentarzem do polecenia „revert --all” czy wykonywanym krokiem? Pytam, ponieważ "hg update" zaktualizuje tylko te pliki, które uległy zmianie. Jeśli usuniesz inne pliki przed aktualizacją, nie odzyskasz ich, chyba że zaktualizujesz z powrotem do wersji zerowej ( hg update 00), a następnie wrócisz do wskazówki. Dlaczego nie hg revert --allwystarczy wrócić do spójnego stanu folderu roboczego przed ściągnięciem i aktualizacją?
Lasse V. Karlsen

to osobny krok wykonywany przez moje oprogramowanie do kompilacji. (Mogłem po prostu użyć polecenia usuwania z wiersza poleceń, ale tego nie zrobiłem).
Rory,

1
Można znaleźć archivepolecenie, aby być przydatne w przyszłości. Na przykład mógłbyś hg archive ../newbuild, a migawka twojego repozytorium na końcu hg updatezostanie tam umieszczona. Zwykle robię to w przypadku nocnych kompilacji, aby nie ryzykować zaśmiecania mojego repozytorium. Po prostu usuń katalog kompilacji, gdy już go nie potrzebujesz.
Tim Post

Odpowiedzi:


212

Kroki te powinny dać się skrócić do:

hg pull
hg update -r MY_BRANCH -C

-CFlaga informuje polecenie aktualizacji, aby odrzucić wszystkie zmiany lokalne przed aktualizacją.

Jednak może to nadal pozostawić nieśledzone pliki w repozytorium. Wygląda na to, że chcesz się ich pozbyć, więc purgeużyłbym do tego rozszerzenia:

hg pull
hg update -r MY_BRANCH -C
hg purge

W każdym razie nie ma jednego polecenia, o wykonanie którego możesz poprosić Mercurial, a które zrobi wszystko, co chcesz, z wyjątkiem zmiany procesu na metodę „pełnego klonowania”, której nie możesz wykonać.


6
Dzięki, to była „czystka”, której potrzebowałem. Aktualizacja -C nie usuwa nieśledzonych plików, co jest główną rzeczą, z którą się zmagałem.
Rory

4
Możesz również użyć TortoiseHg do oczyszczenia. Musisz tylko włączyć rozszerzenie w ustawieniach środowiska roboczego (lub edytować mercurial.ini).
Dave

18
Jeśli rozszerzenie oczyszczania nie jest aktywowane, możesz również użyć następującego polecenia: hg --config "extensions.purge=" purge --all
Samuel Delisle,

5
@ csharptest.net hg purge --allpo prostu przyprawił mnie o ból głowy, ponieważ usunął również moje lokalne konfiguracje, tj. użytkownik bazy danych / hasło itp. :)
VMC

@SamuelDelisle dziękuję dobry panie, nie chciałem dokonywać żadnych zmian w konfiguracji tylko dla tego jednorazowego polecenia w moim skrypcie!
joonas.fi

113
hg up -C

Spowoduje to usunięcie wszystkich zmian i zaktualizowanie do najnowszej głowy w bieżącej gałęzi.

Możesz także włączyć rozszerzenie czyszczenia, aby móc usunąć również wszystkie niewersjonowane pliki.


Czy obejmuje to pliki, które nie są śledzone? Miałem problemy z tymi w innych poleceniach, których próbowałem. Spróbuję teraz ...
Rory,

7
@Rory: nie, hg purgedotyczy niewersjonowanych plików.
zerkms

10

Aby usunąć nieśledzone na * nix bez rozszerzenia czyszczenia, którego możesz użyć

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Który używa

update -r --rev REV rewizja

update -C --clean odrzuca niezatwierdzone zmiany (brak kopii zapasowej)

status -u --unknown pokazuje tylko nieznane (nie śledzone) pliki

status -n --no-status ukryj przedrostek statusu


4

Jeśli szukasz łatwej metody , możesz spróbować tego.

Osobiście prawie nie pamiętam linii poleceń dla wszystkich moich narzędzi, więc zwykle robię to za pomocą interfejsu użytkownika:


1. Najpierw wybierz „zatwierdź”

Popełnić

2. Następnie wyświetl ignorowane pliki. Jeśli masz niezatwierdzone zmiany, ukryj je.

Pokaż ignorowane pliki

3. Teraz zaznacz je wszystkie i kliknij „Usuń bez wersji”.

Usuń ich

Gotowe. Jest to procedura, która jest o wiele łatwiejsza do zapamiętania niż rzeczy z linii poleceń.


Nie jestem pewien (sam używam SourceTree), ale te zrzuty ekranu wydają się pochodzić z TortoiseHg Workbench. Ogólnie uważam, że rozwiązania oparte na interfejsie użytkownika są pomocne, ale ta odpowiedź wymaga lepszego oznakowania. Poza tym „ukryj je” brzmi dla mnie trochę niejasno.
Jon Coombs,

3

hg status pokaże ci wszystkie nowe pliki, a następnie możesz je po prostu rmować .

Zwykle chcę się pozbyć zignorowanych i niewersjonowanych plików, więc:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

A następnie wykonaj:

hg update -C -r xxxxx

co ustawia wszystkie wersjonowane pliki w odpowiednim stanie dla wersji xxxx


Aby podążać za tradycją przepełnienia stosu, mówiącą ci, że nie chcesz tego robić, często stwierdzam, że ta „opcja nuklearna” zniszczyła rzeczy, na których mi zależy.

Właściwym sposobem na to jest posiadanie opcji „make clean” w procesie budowania, a może także „make reallyclean” i „make distclean”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.