Extenze hgsubversion mění Mercurial na klienta Subversion. To nám umožňuje používat lokální (offline) komit a všechny ostatní pěkné nástroje Mercurialu a posílat (push) changesety zpět do Subversion.
Extenze vyžaduje pojítka (bindins) Python-Subversion. Ve Windows jsou součástí aplikace TortoiseHg, v Linuxu musíte vyhledat paket python-subversion ve správci paketů.
Samotné extenze instalujete spuštěním:
$ hg clone https://hgsubversion.googlecode.com/hg/ hgsubversion
Nyní zadejte:
[extensions] hgsubversion = path/to/hgsubversion
do svého konfiguračního souboru pro načtení extenze. Pokud jste instaloval extenzi s použitím svého správce paketů, potom byla nejspíše již vložena do proměnné PYTHONPATH a potřebujete pouze přidat:
[extensions] hgsubversion =
Použijte hg help subversion abyste si ověřili, že extenze byla úspěšně povolena
Připravili jsme repozitář Subversion s malým programem Hello World pro několik skupin. Pro každou skupinu je určen repozitář, označený jako hello1 až hello5:
alice$ hg clone http://mercurial.aragost.com/svn/helloX hello-hg [r1] mg: Created initial layout. [r2] mg: First known version by Brian Kernighan, 1974. [r3] mg: Include stdio.h. [r4] mg: Output newline. [r5] mg: Version 1.0. [r6] mg: Capitalized! [r7] mg: Comments are good. [r8] mg: Added README. [r9] mg: Added Makefile. [r10] mg: Ignore compiled program. pulled 9 revisions updating to branch default 4 files updated, 0 files merged, 0 files removed, 0 files unresolved alice$ cd hello-hg
Poznámka
Pokud vám nechodí URL adresa http(s):// , zkuste svn+http(s)://. Tím by mělo být jednoznačně uvedeno, že chcete provést klon ze Subversion.
Alenka zkontroluje repozitář příkazem thg log aby viděla, že byly tagy řádně definovány:
Závěrečná revize Subversion přiřadí vlastnost svn:ignore k hello proto, aby byl kompilovaný binární soubor ignorován. V Mercurialu jsou vzory pro ignorování spravovány v nadřízeném souboru .hgignore. Tento soubor lze generovat příkazem:
alice$ hg svn genignore
Normálně bychom soubor .hgignore komitovali, abychom zajistili jeho sdílení s každým, kdo použije repozitář. Protože je ale Subversion této sestavě nadřízena, není nutné tento soubor posílat zpátky. Z toho důvodu ignoruje generovaný soubor .hgignore sám sebe. Občas jej lze regenerovat příkazem hg svn genignore --force.
Alenka nyní může editovat soubory a komitovat je v Mercurialu:
alice$ echo "/* The End. */" >> hello.c alice$ hg diff diff -r e3314036fa9f hello.c --- a/hello.c Fri Mar 12 10:20:45 2010 +0000 +++ b/hello.c Fri Mar 12 21:20:10 2010 +0000 @@ -7,3 +7,4 @@ printf("Hello, World!\n"); return 0; } +/* The End. */ alice$ hg commit -m "Added footer."
Změna se dosud na server Subversion nedostala, jako obvykle, musíme provést příkaz push. Posílání changesetu zahrnuje jeho přepsání. To proto, že server Subversion je nadřízený (master) a když v něm provádíme komit, sám rozhoduje o jménu uživatele a označení času přináležející k revizi. Na straně Mercurialu je changeset přepsán aby reflektoval aktualizovaná metadata:
alice$ hg outgoing comparing with http://mercurial.aragost.com/svn/helloX changeset: 9:2dc661f0cdc8 tag: tip user: Alice <alice@example.net> date: Fri Mar 12 21:20:15 2010 +0000 summary: Added footer. alice$ hg push pushing to http://mercurial.aragost.com/svn/helloX searching for changes [r11] alice: Added footer. pulled 1 revisions saved backup bundle to $HOME/hello-hg/.hg/strip-backup/2dc661f0cdc8-backup.hg
Vidíme následující aktualizovaný changeset:
alice$ hg tip changeset: 9:a545b3d1c21d tag: tip user: alice@66d5687c-2042-4ccc-9f0a-7e74790c38a1 date: Fri Mar 12 21:25:00 2010 +0000 summary: Added footer.
Všimněte si změny jména uživatele a časového záznamu poté, co Subversion tyto údaje aktualizoval. Protože jsou changesety přepisovány, neměly by se provádět další klony původního klonu. Pokud tak učiníte, musíte ručně odtrhnout starší verze changesetů od changesetů, posílaných do Subversion.
Alenka provede ve svém klonu několik lokálních změn:
alice$ hg outgoing comparing with http://mercurial.aragost.com/svn/helloX changeset: 10:9a6e43d86b16 user: Alice <alice@example.net> date: Fri Mar 12 21:26:00 2010 +0000 summary: Express greater joy! changeset: 11:f3bd093438f1 tag: tip user: Alice <alice@example.net> date: Fri Mar 12 21:27:00 2010 +0000 summary: Added simple MIT license header.
Mezitím se změnil repozitář v Subversion:
alice$ hg incoming incoming changes from http://mercurial.aragost.com/svn/helloX revision: 12 user: alice date: 2010-03-12T21:26:30.0Z message: List email address for bug reports. alice$ hg pull pulling from http://mercurial.aragost.com/svn/helloX [r12] alice: List email address for bug reports. pulled 1 revisions (run 'hg update' to get a working copy)
Nová revize vytváří rozbočku (fork) v historii:
Když Alenka provede push, její oba changesety (7d780c6154fb a 12445668eefc) se automaticky přeskupí k revizi, kterou právě stáhla ze Subversion (2099057558d2):
alice$ hg push pushing to http://mercurial.aragost.com/svn/helloX searching for changes [r13] alice: Express greater joy! pulled 1 revisions saved backup bundle to $HOME/hello-hg/.hg/strip-backup/xxxxxxxxxxxx-backup.hg [r14] alice: Added simple MIT license header. pulled 1 revisions saved backup bundle to $HOME/hello-hg/.hg/strip-backup/xxxxxxxxxxxx-backup.hg
Toto je nezbytné, protože Subversion je přísně lineární systém. Nová historie vypadá takto:
Extenze hgsubversion nám umožňuje používat Mercurial jako klienta systému Subversion. To nám přináší následující výhody oproti normálnímu klientovi Subversion:
Úplná historie klienta. To umožňuje použití technik Mercurialu pro rychlé vyhledávání chyb - ať už to je prosté prohledávání historie pro určitý zadaný řetězec s pomocí hg grep či hg annotate, nebo náročnější binární prohledávání prováděné s příkazem hg bisect.
Lidé začnou pracovat odlišně, jestliže jsou jejich nástroje dostatečně rychlé. Mercurial je navržen pro rychlý lokální přístup.
Lokální (offline) komity. Správa verzí je o sledování vývoje kódu. Měla by umožnit experimentovat s novými nápady a prvky. Tomu napomáhají časté lokální komity - třeba každých pět minut.
Subversion nutí lidi tyto revize neprodleně publikovat. Ti potom mají tendenci šetřit s komity (zejména do kmene) ze strachu, že naruší sestavu kmene (trunk). Pokud pracují na větvi, všechny tyto komity zamoří historii a zatíží přehledy.
Mercurial umožňuje lidem komitovat tak často, jak často potřebují. Změny je možné později přepracovat na menší počet výstižnějších komitů a ty lze potom poslat na server Subversion.
Necentralizovaný vývoj. Nahoře jsme viděli, jak se changesety přeskupily, když byly poslány do Subversion. Je obtížné spolupracovat s ostatními, když se nám changesety, na kterých pracujeme, soustavně mění pod rukama.
Je ovšem možné pracovat na nové věci necentralizovaným způsobem. Stačí, aby spolupracovníci počkali s jejím odesláním do Subversion, dokud není hotova. Při jejím vývoji si můžete změny posílat a stahovat podle libosti. Po dokončení vývoje provedete integraci se Subversion a požádáte ostatní, aby odvrhli své lokální klony a stáhli si přeskupené changesy ze serveru Subversion.
Extenzi hgsubversion lze také použít ke konverzi k Mercurialu. Ten obsahuje speciální extenzi pro konverzi ale je známo, že hgsubversion konvertuje některé repozitáře lépe a přesněji.
Hlavním problémem při konverzi ze Subversion (nebo vlastně z každého staršího systému) k Mercurialu je nedostatek pružnosti starého systému. Subversion nemá tagy ani větve, pouze (velmi) přísnou konvenci, která říká že kopie z trunk/ do branches/foo naznačuje vytvoření větve s názvem “foo”. Nic však nebrání kopírovat polovinu trunk do branches/foo, nebo provedení komitu, který mění soubory v trunk a v branches/foo současně.
Tento druh "strusky" nelze vždy v Mercurialu prezentovat rozumným způsobem, nicméně extenze hgsubversion je při interpretaci dobrým pomocníkem.