Mercurial dla początkujących: ostateczny praktyczny przewodnik

237

Zainspirowany przez Git dla początkujących: ostateczny praktyczny przewodnik .

Jest to kompilacja informacji na temat korzystania z Mercurial dla początkujących w celu praktycznego zastosowania.

Początkujący - programista, który dotknął kontroli źródła, nie rozumiejąc go zbyt dobrze.

Praktyczny - obejmujący sytuacje, które często napotyka większość użytkowników - tworzenie repozytorium, rozgałęzianie, scalanie, pobieranie / wypychanie z / do zdalnego repozytorium itp.

Uwagi :

  • Wyjaśnij, jak coś zrobić, zamiast tego, jak coś jest realizowane.
  • Odpowiedz na jedno pytanie na odpowiedź.
  • Odpowiedz w sposób jasny i zwięzły, jak to możliwe.
  • Edytuj / rozszerz istniejącą odpowiedź zamiast tworzyć nową odpowiedź na ten sam temat.
  • Podaj link do wiki Mercurial lub HG Book dla osób, które chcą dowiedzieć się więcej.

Pytania:

Instalacja / konfiguracja

Praca z kodem

Tagowanie, rozgałęzianie, wydania, linie bazowe

Inny

Inne referencje dotyczące rtęci

Laz
źródło

Odpowiedzi:

16

Jak skonfigurować go tak, aby ignorował pliki?

Opcja Ignoruj ​​jest skonfigurowana w zwykłym pliku tekstowym o nazwie .hgignore w katalogu głównym repozytorium. Dodaj go tak jak normalny plik z:

hg add .hgignore

Dostępne są dwie opcje składni do dopasowywania plików, glob i regexp. glob jest uniksowym rozszerzaniem nazw plików, a wyrażenie regularne to wyrażenia regularne. Każdą aktywujesz, dodając osobno syntax: globlub syntax: regexpw linii. Wszystkie kolejne wiersze będą używać tej składni, aż do następnego znacznika składni. Możesz mieć tyle znaczników składni, ile chcesz. Domyślna składnia to regexp, więc jeśli używasz tylko wyrażenia regularnego, nie potrzebujesz żadnego znacznika składni.

Możesz dodawać komentarze za pomocą #

Przykład:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

Ignoruj ​​dotyczy tylko plików niezarządzanych (tj. Plików, które nie są jeszcze zameldowane). Aby zignorować pliki znajdujące się pod kontrolą wersji, możesz użyć przełączników -I i -X.

Joakim Lundborg
źródło
7
Warto wspomnieć, że jeśli ręcznie hg addzignorujesz pliki, Mercurial będzie je śledził. Na przykład, jeśli masz kilka plików, takich jak deploy-test.conf, deploy-production.confnie, itp i chce je wersją (mogą mieć haseł w nich), ale zrobić chcesz wersji deploy-template.confmożna po prostu zignorować deploy*i ręcznie dodać deploy-templace.conf.
Steve Losh
7

Jak widzisz, co jest niezaangażowane, lub status swojej obecnej bazy kodów?

Aby wyświetlić listę plików, które zostały zmienione:

$ hg status

Spowoduje to wydrukowanie każdego zmienionego pliku wraz z jego statusem, który może obejmować:

  • M- Zmodyfikowano. Plik został zmieniony i zmiany nie zostały zatwierdzone.
  • A- Dodany. Plik nie był wcześniej śledzony, ale jeśli zatwierdzisz, Mercurial rozpocznie śledzenie.
  • R- usunięty. Plik był wcześniej śledzony, ale jeśli popełnisz, Mercurial przestanie go śledzić w tym i przyszłych zatwierdzeniach.
  • ?- Nieznany. Plik nie jest obecnie śledzony przez Mercurial. Zatwierdzanie nie będzie miało na to żadnego wpływu, chyba że użyjesz go hg adddo dodania.
  • !- Brakuje. Plik był śledzony, ale Mercurial nie może go znaleźć w kopii roboczej.

Aby zobaczyć zmiany, które faktycznie zostały wprowadzone w plikach:

$ hg diff
Steve Losh
źródło
6

Jak tworzysz nowy projekt / repozytorium?

$ hg init my-repository

źródło
5

Jak połączyć się z Subversion?

Istnieją trzy sposoby:


Rozszerzenie konwersji będzie sklonowanie istniejącego repozytorium Subversion w jednym Mercurial. Pochodzi z Mercurial. Działa mniej więcej tak:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

Na przykład spowoduje to przechwycenie pnia repozytorium SixApart.

hg convert http://code.sixapart.com/svn/memcached/trunk

Rozszerzenie może stopniowo wprowadzać nowe wersje z repozytorium Subversion do repozytorium Mercurial (trochę jak pull). Jednak nie obsługuje przyjmowania poprawek Mercurial i wysyłania ich z powrotem do Subversion (bez wypychania). [XXX: Popraw to, jeśli jest źle] .


Przedłużenie hgsubversion . Jest to pod wieloma względami najbardziej wyrafinowane rozwiązanie, ponieważ wykorzystuje interfejs API Subversion do komunikacji z repozytorium Subversion. Ma on stać się mostem hg-svn. Pozwala na pełne przerzucanie zmian wersji (pełne klonowanie, ściąganie i wypychanie), jednak z chwilą pisania [XXX: popraw to, jeśli / kiedy stanie się niepoprawny] jest wciąż w fazie rozwoju i nie ma jeszcze oficjalnych wydań. W związku z tym działa tylko z najnowszą wersją Mercurial (1.3 od tego tekstu).

  • Odwzorowuje znaczniki i gałęzie (poprzedzając wszystkie znaczniki, tags/aby odróżnić je od równorzędnych nazw gałęzi).
  • Utrzymuje specjalną gałąź closed-branchesdo zamykania gałęzi, które są usuwane w Subversion.
  • To wymaga , że repozytorium Subversion być rozplanowany zgodnie z konwencją z trunk / oddziały / tagi.
  • Zestaw poleceń zazwyczaj hg svn <subcommand>ma na celu integrację do tego stopnia, że ​​nie potrzebujesz części „svn” (tzn. Chce traktować klon Subversion tak bardzo, jak to możliwe, jak każde inne repozytorium Mercurial);

Działa to tak:

klon:

hg svnclone <Subversion URL> 

LUB (tylko w przypadku svn://adresów URL)

hg clone <svn:// URL>

Ciągnąć:

hg svn pull

Pchać:

hg svn push

przychodzące:

hg svn incoming

towarzyski:

hg svn outgoing

Sprawdzanie całego repozytorium:

hg svnclone http://code.sixapart.com/svn/memcached

Narzędzie hgsvn ( drzewo bitbucket ). Do niedawna pozwalało to tylko na klonowanie i pobieranie repozytorium Subversion, ale od hgsvn 0.1.7teraz obsługuje push. [Nie wiem, jak dobrze to popycha. Każdy, kto ma większe doświadczenie, powinien to zaktualizować.] Ma następujące ważne funkcje:

  • Generuje tag Mercurial dla każdego tagu SVN.
  • Umieszcza lokalny znacznik na każdym zestawie zmian, aby zaznaczyć swoją wersję SVN.
  • Umieszcza każdą wersję Mercurial na nazwanym oddziale nazwanym na podstawie jego oddziału SVN. Na przykład branches/some-featurebyłoby hg branch some-feature. Włącza łącze trunk(tzn. Nic nie znajduje się w domyślnej gałęzi Mercurial, chyba że użytkownik wyraźnie do niej przełączy).
  • Spróbuje zidentyfikować gałęzie i tagi i utworzyć je, ale jeśli nie będzie w stanie, po prostu je pominie. Jest to przydatne, gdy repozytorium Subversion nie jest zgodne z konwencjonalnym układem linii głównej / gałęzi / znaczników.

Działa to tak:

klon:

hgimportsvn <Subversion URL>

Ciągnąć:

hgpullsvn

Pchać:

hgpushsvn

przychodzące:

hgpullsvn -n

towarzyski:

hgpushsvn -n

Sprawdzanie całego repozytorium:

hgimportsvn http://code.sixapart.com/svn/memcached

Sprawdzanie tylko bagażnika:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk
twaróg
źródło
2
Właśnie użyłem hg converti naprawdę zajmuje dużo czasu, gdy masz repozytorium svn z wieloma zatwierdzeniami. Utworzenie lokalnego repozytorium svnsyncpomaga znacznie przyspieszyć działanie - szczególnie, gdy trzeba to zrobić kilka razy, ponieważ w komendzie konwersji masz złe opcje.
Debilski
Myślę, że wszystkie te metody są szybsze, jeśli masz lokalną kopię repozytorium SVN. Ale nie zawsze możesz dostać się do pełnego repozytorium, prawda? Pomyślałem, że muszę svnsyncuzyskać dostęp do rzeczywistych plików repozytorium, a nie tylko adresu URL.
kwark
Pamiętaj, że hgsvn jest teraz w trybie konserwacji , więc nie jest już aktywnie rozwijany. Zalecają zamiast tego użycie hgsubversion.
Jon L.,
5

Jak porównać dwie wersje pliku lub bieżący plik i poprzednią wersję?

Oba używają hg diff. Kiedy hg diffjest używany, wszystkie zmiany w kopii roboczej i wskazówka (ostatnie zatwierdzenie) są wyświetlane.

„Jak porównać dwie wersje pliku?”

$ hg diff -r{rev1} -r{rev2} {file.code}

Powyższe polecenie pokaże różne wersje rev1 i rev2 „file.code”.

„Jak porównać swój bieżący plik z poprzednią wersją?”

$ hg diff {file.code}

Powyższe polecenie pokaże różne między bieżącą wersją „file.code” a ostatnią wersją (ostatnią zatwierdzoną).

:RE

NawaMan
źródło
4

Jak „oznaczyć” „tagować” lub „zwolnić” konkretny zestaw poprawek dla określonego zestawu plików, aby zawsze móc pobrać go później?

$ hg tag my-tag

Możesz także sklonować swoje repozytorium, aby utworzyć specjalne repozytorium znaczników .

$ hg clone working-repository my-tag-repository

źródło
3
Dlaczego nie hg tag my-tag?
Steve Losh
4

Jak się rozgałęziasz?

$ hg oddział mój oddział

lub

$ hg klon oryginalnego repozytorium moja gałąź

Chociaż należy zauważyć, że oddział tworzy katalog „wirtualny” (tzn. Pliki pozostają takie same, ale hg traktuje je tak, jakby były różne w systemie), podczas gdy klon tworzy rzeczywistą, kompletną kopię. Ściśle mówiąc, klon nie rozgałęzia się.

Nick Hodges
źródło
4
Jest to ciężki sposób, w jaki ludzie git zawsze wyśmiewają się z ludzi Mercurial za polecanie. hg branch my-branch
Lżejszym
8
Należy zauważyć, że są to dwie całkowicie różne operacje.
stepancheg
2
Znalazłem ten przewodnik, który może być pomocny w przypadku rozgałęziania w Mercurial: stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
mbillard
W przypadku lekkich gałęzi w HG, które nie są trwałe (jako gałąź
HG
Artykuł połączony przez GoodEnough stanowi kolejną lekką metodę wykorzystującą zakładki. Wydaje się być całkiem dobry w przypadku zmian, które nie są znaczące, aby zasłużyć na swój oddział
Casebash
4

Dobra wtyczka GUI / IDE dla Mercurial?

GUI

  • TortoiseHg dla prawie każdego systemu operacyjnego. Obejmuje integrację z Eksploratorem Windows. Działa również w systemie Linux i kilku innych systemach operacyjnych, w tym Max OS X. Ma nieco nieporęczny interfejs i na początku jest nieco trudny w użyciu, ale jest bardzo kompletny i potężny.
  • Program Murky działa w systemie Mac OS X 10.5 lub nowszym. Mroczny jest dobry do przeglądania repozytorium i podstawowych poleceń, ale musisz także wiedzieć, jak korzystać z wiersza poleceń.
  • MacHg to fajny Mac OS X Gui, który ma nieco większą funkcjonalność i jest bardziej dopracowany niż Mętny, ale nadal będziesz potrzebować z nim wiersza poleceń.
  • SourceTree jest oryginalnie klientem Mac, a wersja systemu Windows jest dostępna od niedawna. Całkiem niezły interfejs użytkownika (przynajmniej w OS X), obsługuje większość funkcji Hg, w tym półkę.

Wtyczki

Macke
źródło
3

Jak zatwierdzasz zmiany?

Wywołaj to polecenie z bieżącego lokalnego * repozytorium rtęci

hg commit [OPTION]... [FILE]...

aliasy: ci

  • Lokalne repozytorium rtęciowe ma .hg w bieżącym katalogu

Gdzie może być opcja:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

Przykładowym poleceniem byłoby:

hg commit -m "added readme" README

UWAGI :

  • Jeśli lista plików zostanie pominięta, wszystkie zmiany zgłoszone przez „status hg” zostaną zatwierdzone.
  • Jeśli zatwierdzasz wynik scalenia, nie podawaj żadnych nazw plików ani filtrów -I / -X.
  • Jeśli nie zostanie podany komunikat zatwierdzenia, skonfigurowany edytor zostanie poproszony o wyświetlenie komunikatu.
jpartogi
źródło
3

Jak skonfigurować Mercurial?

Mercurial przechowuje informacje o konfiguracji w ~/.hgrcsystemach * nix i %UserProfile%\mercurial.iniWindows. ( %UserProfile%zwykle "C:\Documents and Settings\[username]\"w systemach Windows 2000 lub Windows XP i zazwyczaj C:\Users\[username]\w systemach Windows Vista i Windows 7).

Na początek powinieneś ustawić swoją nazwę użytkownika Mercurial, umieszczając następujące dane w swoim .hgrclub mercurial.ini:

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <[email protected]>

Użytkownicy TortoiseHg w systemach Windows mogą alternatywnie działać hgtk userconfig

Zobacz także „ Tworzenie pliku konfiguracyjnego Mercurial ” w rozdziale 2Mercurial: The Definitive Guide ”.

las3rjock
źródło
3

Jak łączyć gałęzie?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary
Martin Geisler
źródło
Jako nowy użytkownik rtęci i jako ktoś nowy w zakresie kontroli wersji źródłowej, tak naprawdę nie rozumiem tej odpowiedzi. Czy możesz wyjaśnić i rozwinąć swój post? Nadal nie rozumiem, jak używać polecenia scalania.
Jamin Gray
3

Jak zainstalować Mercurial?

Ładnie edytuj, jeśli instalowałeś ze źródła w systemie Linux lub korzystałeś z instalatorów Windows.

Mac OS X 10.4 (Tiger), 10.5 (Leopard)

Użyj easy_install Pythona (z Setuptools ):

sudo easy_install mercurial

Znajduje najnowszą wersję (1.3.1 w momencie pisania) i instaluje się o:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

W przypadku Python 2.6 omija to również pakiet instalacyjny Mercurial OS X (w wersji 1.2.1 od 26 lipca 2009), skarżąc się, że potrzebuje Python 2.5. Z dokumentacji wynika, że ​​Fink i Macports instalują wersję 1.2.

Linux

Większość jawnych pakietów Linux wydaje się pozostawać w tyle za bieżącą wersją, więc użyj easy_install (jak wyżej) lub pobierz tarball Mercurial , rozpakuj archiwum, przejdź do katalogu mercurial i uruchom:

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(od wprowadzenia Mercurial, rozproszonego systemu kontroli wersji )

Windows

Istnieje pakiet binarny najnowszej wersji Mercurial . TortoiseHg to rozszerzenie powłoki Windows dla i instaluje Mercurial. Cygwin może również zainstalować Mercurial.

Alternatywnie (instrukcje zbyt długie, więc tutaj linkowane) możesz zbudować zoptymalizowaną lub czystą wersję Pythona Mercurial ze źródła.

Dave Everitt
źródło
1
Aby zbudować mercurial ze źródła, potrzebne będą nagłówki Pythona. Zainstaluj python-dev lub python-devel dla tych, którzy używają dystrybucji zorientowanej na pakiety.
Nicolas Dumazet,
3

Jak uzyskać najnowszy kod?

Mercurial pamięta, z którego sklonowano repozytorium (w .hg / hgrc), więc możesz po prostu uruchomić:

hg pull

aby pobrać najnowszy kod z repozytorium pochodzenia. (To nie aktualizuje katalogu roboczego)

hg update

zaktualizować katalog roboczy.

hg pull -u

aby wykonać jednocześnie ściąganie i aktualizację.

Laz
źródło
1
Początek jest rejestrowany .hg/hgrcpodczas klonowania, więc nie musisz go określać podczas ciągnięcia / pchania. Jeśli chcesz, możesz dodać więcej ścieżek do [paths]sekcji .hg/hgrc.
Martin Geisler,
3

Jak sprawdzić kod?

hg clone [OPTION]... SOURCE [DEST]

Gdzie może być opcja:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

Gdzie źródło jest źródłem oryginalnych plików znajdujących się w repozytorium, gdzie może to być zdalny adres URL lub katalog systemu plików. Na przykład:

A miejsce docelowe to miejsce, w którym będzie znajdować się kod źródłowy w lokalnym systemie plików.

jpartogi
źródło
1

Jak zatwierdzasz zmiany?

$ hg commit -m "Commit message"
NawaMan
źródło
1

Jak widzisz, jakie zmiany będą wysyłane do repozytorium nadrzędnego po naciśnięciu?

Użyj, hg outgoingaby uzyskać listę zestawów zmian, które zostaną ustawione w domyślnym repozytorium:

$ hg outgoing

Aby uzyskać rzeczywiste zmiany kodu, użyj -p( --patch). Spowoduje to wyświetlenie każdego zestawu zmian w całości:

$ hg outgoing -p
robotadam
źródło
1

Jak usunąć plik z repozytorium?

Aby usunąć plik z repozytorium i usunąć go przy następnym zatwierdzeniu:

$ hg remove {file(s)}

Aby usunąć plik z repozytorium, ale nie można go usunąć

$ hg remove -Af {file(s)}

lub z Mercurial 1.3

$ hg forget {file(s)}
David Sykes
źródło
1

Jak wrócisz do poprzedniej wersji kodu?

Z tego pytania

$ hg update [-r REV]

@van: Jeśli później zatwierdzisz, skutecznie utworzysz nowy oddział. Następnie możesz kontynuować pracę tylko nad tym oddziałem lub ewentualnie połączyć istniejący z nim.

David Sykes
źródło
1

Jak przywrócić zestaw zmian?

Kilka dostępnych opcji

Łatwy sposób (wycofaj pojedynczy zestaw zmian)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

Hard Way (ręcznie różnicuj i aplikuj)

Krok 1 : Utwórz plik łatki, aby przywrócić zmiany wprowadzone między wersją 107 a 108:

hg diff -r107 -r108 --reverse  > revert-change.patch

(alternatywnie, hg diff -r108 -r107 bez --reverse zrobi to samo)

Krok 2 : Zastosuj plik łatki:

patch -p1 < revert-change.patch

Niektóre różnice mogą nie zostać zastosowane, na przykład:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

Plik .rej będzie zawierał zawartość pliku różnicowego, który nie został zastosowany, musisz zajrzeć.

slf
źródło
1
Czy nie po to hg backoutjest?
Wim Coenen
Tak, jednak wycofanie hg obsługuje tylko jeden identyfikator zestawu zmian dla wycofania. Zdecydowanie należy wspomnieć, odpowiednio zaktualizuję
slf 28.10
1

Jak widzisz historię zmian w pliku lub repozytorium?

Aby wyświetlić historię zmian całego repozytorium lub plików

$ hg log {file(s)}

lub

$ hg history {file(s)}

I zobaczyć listę w odwrotnej kolejności

$ hg log -r:
David Sykes
źródło
1

Jak łączysz części jednej gałęzi z drugą?

Włącz rozszerzenie „przeszczep” w swoim pliku .hg / hgrc

[extensions]
transplant=

Załaduj gałąź docelową, a następnie przeszczep wersję docelową.
np .: cherry pick wersja 81 z gałęzi „foo” do bieżącej gałęzi

$ hg transplant -b foo 81
John Mee
źródło
Nowsze wersje Mercurial nie wymagają przedłużenia przeszczepu. Możesz użyć wbudowanego graftpolecenia, aby zrobić to samo. hg help graftpo więcej informacji
DOOManiac,
1

Jak wyodrębnić łatkę z określonego zestawu zmian?

$ hg export -o patchfile changeset

Następnie możesz zaimportować to do innego oddziału za pomocą:

$ hg import patchfile
David Sykes
źródło