2010-08-08 8 views
18

Czy istnieje sposób na klonowanie repo, które pochodzi z subrepos, ale bez Mercurial pull wszystkich subrepos?Mercurial `hg clone` ale ignorowanie wszystkich subrepos?

Wydaje się, że podczas hg clone -U mogą być wykorzystywane w celu uzyskania pustego klon repo, nie ma nic, co by przekonać hg update uniknąć ruszania pociągając wszystkich subrepos.

Należy podkreślić, że bardzo ważne jest zachowanie możliwości łatwej synchronizacji z wersją głowy po utworzeniu takiego klonu.

Odpowiedz

5

Ta odpowiedź może dodać więcej niż pytaniem jest to wymagane, ale zawiera kilka cennych wskazówek na temat pracy z Mercurial, gdy nie można aktualizować zrobić poważnej subrepository ścieżki lub rewizja.

Krok 1: Klonowanie repozytorium bez aktualizacjach

hg clone --noupdate source_repository destination_repository 

Krok 2: Użyj powróci, aby uzyskać prawo pliki

hg revert --all --rev revision_number --exclude subrepo_1 --exclude subrepo_2 ... 

W tym momencie masz nowy changeset; może być konieczne sprawdzenie poprawności wersji nadrzędnej. Kiedy to zrobiłem, rodzicem nowego nowego zestawu zmian był 0. Aby to naprawić, musiałem ustawić macierzysty zestaw zmian ORAZ przełączać gałęzie (ponieważ mój zestaw zmian był w innej gałęzi).

Krok 3: Zmiana rodzica prądu zmienia

hg debugsetparents revision_number 
hg branch branch_name 

To powinno wystarczyć.

+2

Po Kroku 3, 'hg status' nadal pokazuje wszystkie pliki jako oczekujące dodaje. Uruchamianie 'hg debugrebuildstate -r tip' naprawia to. –

3

Jeśli masz subrepo, katalog roboczy musi zawierać pewną wersję tego subrepo. Ta wersja może być naprawioną starszą wersją, jeśli została określona, ​​lub wskazówką, jeśli nie.

Nie można zaktualizować repo bez uzyskania podrepos; gdybyś miał bez nich pełną pracę, nie powinieneś używać subrepos - użyj prawdziwie zewnętrznych repo.

Jeśli Twoje podrepos są powiązane z pewną wersją zdalną, aktualizacje po pierwszej nie będą powodować aktualizacji subrepo - są już aktualne. Ale dla początkowego utworzenia katalogu roboczego, będziesz musiał wykonać zdalne przyciąganie.

Możesz oszukać Mercurial przez zmieszanie pliku hgsubstate. Ale tak naprawdę, twój model i model koncepcyjny różnią się, więc prawdopodobnie nie pasujesz do podskrobów, jeśli jest to problemem.

edytuj: Jeśli klonujesz, a następnie wiele razy aktualizujesz podpowiedź, spróbuj zamiast tego użyć lokalnych oddziałów lub mq. W ten sposób wystarczy wykonać początkowy klon tylko raz.

+0

Przez większość czasu wydają się być dobrym dopasowaniem. Po prostu subrepos są duże, a najlepszym sposobem na odróżnienie się od oficjalnego "serwera", który znalazłem, jest utrzymanie lokalnego lokalnego kasy. Subrepos dodać ton overhead do tego podejścia. –

+0

@romkyns: jeśli chcesz tylko śledzić zmiany, użyj 'hg out' (lub' hg diff' dla niezatwierdzonych zmian). Albo możesz po prostu stworzyć "czysty" klon i użyć 'hg pull -u' na nim od czasu do czasu, aby go aktualizować ... – Borealid

+0

Dzięki, myślę, że po prostu będę tolerować masę dodatkowych kopii te ogromne podobieństwa. Uważam, że 'hg diff' jest nieoptymalny do przeglądania kodu i zamiast tego korzysta z zewnętrznego dyferencjału opartego na interfejsie graficznym. –

4

Znaleziono hacky sposób. Nadal wymaga, aby wszystkie podobiekty były wyrejestrowywane jeden raz, ale później można je usunąć.

  1. Klonowanie całej partii, w tym podrabin. Nie ma mowy o tym.
  2. Usuwanie subrepos
  3. hg remove .hgsub

Próbowałem przekonać Mercurial do hg remove .hgsub przed subrepos są klonowane, ale najlepsze co mam to not removing .hgsub: file is untracked.

+6

To wstyd. –

+6

To rozwiązanie naprawdę nie pomoże, jeśli twoja zewnętrzna subrepo jest z jakiegoś powodu niedostępna. Trochę dyskusji o ignorowaniu subrepos [tutaj] (http://mercurial.selenic.com/bts/issue2520). –

13

ten powinien robić to, co chcesz:

REM Take a new clone, but do not update working directory 
hg clone --noupdate %REPO_PATH% %DESTINATION% 

REM Update working directory but exclude the certain subprojects 
hg revert --all --rev %BRANCH% --exclude %SUBREPO_PATH_1% --exclude %SUBREPO_PATH_2% 
Powiązane problemy