Mercurial

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 28. února 2021; kontroly vyžadují 8 úprav .
Mercurial
Typ distribuovaný systém správy verzí [d]
Vývojář Matt Mackall
Zapsáno v Python , C a Rust
Operační systém multiplatformní
První vydání 19. dubna 2005 [1]
Nejnovější verze
Licence GNU GPL 2+ [4]
webová stránka mercurial-scm.org
 Mediální soubory na Wikimedia Commons

Mercurial (z  angličtiny  -  „mercury, mobile“), také známý jako Hg (od označení chemického prvku rtuť ) je multiplatformní distribuovaný systém pro správu verzí navržený pro efektivní práci s velmi velkými úložišti kódu . V první řadě je to konzolový program.

Mercurial vyšel ze stejného konfliktu, který vedl k vytvoření Gitu . Autorem nového systému byl Matt Mackall .

Popis

Systém Mercurialu je napsán v Pythonu , i když části citlivé na výkon (jako je jeho vlastní implementace diff ) jsou implementovány jako rozšiřující moduly v C [5] . Ke zlepšení výkonu se také používá rez . [6] Mercurial byl původně napsán pro Linux , později portován na Windows , Mac OS X a většinu unixových systémů. Repozitáře Mercurialu jsou spravovány pomocí nástroje příkazového řádku hg, ale existují také GUI.

Spolu s tradičními funkcemi systémů pro správu verzí Mercurial podporuje zcela decentralizovanou práci (neexistuje koncept hlavního úložiště kódu), větvení (je možné udržovat několik větví jednoho projektu a kopírovat změny mezi větvemi), slučování úložišť (což dosáhne „rozdělení“ práce). Podporuje komunikaci mezi repozitáři přes HTTP / HTTPS , SSH a ručně pomocí zabalených sad změn.

Nástroj hgmá kompaktní rozhraní a Mercurial je považován za jednodušší na naučení než například git [7] .

Koncepty

Pracovní postup

Mercurial je distribuovaný (decentralizovaný) systém správy verzí. To znamená, že pracovní postup obvykle vypadá takto:

  1. Na osobním počítači se vytvoří nové úložiště (klonováním existujícího úložiště, vytvořením nového atd.);
  2. Soubory se mění/přidávají/odstraňují v pracovním adresáři tohoto úložiště;
  3. Změny se projeví v tomto úložišti (tj. v místním úložišti na osobním počítači);
  4. Kroky 2 a 3 se opakují tolikrát, kolikrát je potřeba;
  5. Soubory změn jiných lidí jsou odebrány (pull);
  6. Sloučit změny (sloučit);
  7. Jsou dány (tlačit) vlastní.

To znamená, že veškerá každodenní práce probíhá v místním úložišti, a když je potřeba, výsledky jejich práce jsou odesílány do jednoho nebo více dalších úložišť. Počet kroků při práci se vzdálenými repozitáři můžete snížit tím, že nakonfigurujete Mercurial tak, aby automaticky předával změny do jiných úložišť, když je proveden odevzdání [8] .

Konzolový program

Konzolový program je implementován tak, že název libovolného příkazu lze zkrátit, pokud jeho název zůstane jednoznačný. Navíc některé příkazy mají aliasy. hg commitMůžete například napsat hg commi, hg commnebo místo toho hg com, ale pokud napíšete hg c, pak Mercurial odmítne tento příkaz provést s tím, že „ příkaz 'c' je nejednoznačný “ a uvede seznam příkazů, které spadají pod tuto zkratku. Nemůže být použit hg cojako zkratka pro hg commit, protože je to alias pro příkaz, hg update,ale zkratka je k dispozici hg ci.

Logická struktura changesetů

Když je příkaz hg commitvyvolán, změny jsou potvrzeny. Zároveň program uloží sadu změn ( anglicky  changeset nebo revize) do úložiště. Fyzicky proběhnou stejné změny jako ty vaše, ale uloží se do servisních souborů, a ne do kopie (více v Behind the scenes ).

Všechny changesety, které byly potvrzeny, jsou zpravidla zobrazeny jako velká propojená síť (graf), kde je každý changeset spojen s jedním nebo dvěma dalšími.

ID nadřazených sad změn, se kterými jsou potvrzené sady změn spojeny, můžete najít pomocí příkazu hg log --debug. Každá sada změn bude mít dva rodiče (což umožňuje větvení v rámci úložiště, viz hg -v help branch). Hodnota "-1:0000000000000000000000000000000000000" znamená žádný rodič. Například úplně první changeset v úložišti bude mít tuto hodnotu nastavenou pro oba rodiče, zatímco následující changesety budou mít tuto hodnotu nastavenou pro druhého rodiče (pokud pro ně nebylo v úložišti použito větvení) a první rodič bude mít ID z předchozí sady změn.

Je také užitečné uvažovat o pracovním adresáři jako o stejné sadě změn (která ještě není potvrzena, ale může být brzy potvrzena také). Pracovní adresář je také spojen s jedním nebo dvěma nadřazenými sadami změn, které lze nalézt pomocí příkazu hg parents. Po potvrzení změn se tito rodiče stanou rodiči pro novou (již potvrzenou) sadu změn.

Identifikace sad změn

Revize jsou rozpoznány podle následujících vlastností [9] :

Číslo revize

Číslo revize je celé číslo představující pořadí, ve kterém byly changesety přidány do úložiště. Číslo revize začíná nulou, je automaticky přiřazeno k sadě změn a lze jej použít k identifikaci sad změn. Číslo revize pro stejný changeset se může v každém klonu úložiště lišit. Ve výstupu příkazu hg logje číslo revize vidět před dvojtečkou (například "4: e1be1898f374").

ID sady změn

ID changesetu je hash SHA-1 skládající se z čísel a písmen „a, b, c, d, e, f“, například „e1be1898f3747386c41c8a5c5776e87373f6d3d3“. Každému changesetu je automaticky přiřazeno ID changesetu, které se vypočítá z obsahu daného changesetu, a proto odpovídá stejnému changesetu ve všech úložištích. Pravděpodobnost kolize, když je generován stejný hash SHA-1 pro dvě různé sady změn, je extrémně malá.

Mercurial při použití v příkazech nevyžaduje celý řetězec identifikátoru, potřebuje pouze jeho počáteční část, která jednoznačně identifikuje požadovaný changeset (jinak Mercurial oznámí nejednoznačnost). Ve výstupu příkazu hg loglze ID changesetu vidět za dvojtečkou (například "4:e1be1898f374"). Bez parametru --debugpříkaz hg lognevypíše úplný, ale zkrácený (12 znaků) identifikátor changesetu.

Tagy

Kromě čísla revize a ID changesetu nabízí Mercurial možnost dát každému changesetu jedno nebo více libovolných symbolických jmen, nazývaných tagy (nebo tagy ). Štítky se přiřazují pomocí příkazu hg taga pomocí příkazu můžete zobrazit všechny přidané štítky hg tags. Název štítku nemůže obsahovat některé znaky (například ": "), které Mercurial v případě potřeby ohlásí při provádění příkazu hg tag.

Kdekoli lze v příkazech zadat ID changesetu, lze jej nahradit názvem štítku.

Název pobočky

Každá pobočka má svůj název. Je specifikováno při vytvoření větve a nikdy se již nemění.

Nejasné momenty

  • Pokud je příkazu předáno číslo jako ID revize, Mercurial bude předpokládat, že mu bylo přiděleno číslo revize, a pouze v případě, že neexistuje žádná sada changesetů s daným číslem revize, se bude lišit od zkráceného ID sady změn. Pokud má úložiště například jeden changeset s číslem revize "6" a druhý changeset s id "647362ac74d76124267215af1a3f94aa9707dfdf" (začíná číslem "6"), příkaz hg log -r 6vypíše informace o prvním changesetu, aniž by hlásil nejednoznačnost. Pokud tedy globální identifikátor začíná číslicí, je užitečné jej zkracovat vždy jen do té doby, než obsahuje písmeno. Toto chování bylo pozorováno ve verzi 2.2.1 pod Mac OS X 10.7.4.
  • Pokud vytvoříte tag s názvem jako "5", zatímco je (nebo v budoucnu bude) v úložišti changeset s číslem revize "5", pak Mercurial nejprve vyhledá changesety podle čísla revize. Ale pokud vytvoříte tag s názvem jako „e1be“, zatímco v úložišti je (nebo v budoucnu bude) changeset s ID changesetu začínajícím „e1be“, pak Mercurial nejprve vyhledá changesety podle tagů. Navíc v obou případech nebude tato nejednoznačnost hlášena. Z tohoto důvodu se nedoporučuje vytvářet štítky složené pouze z čísel a/nebo písmen "a, b, c, d, e, f" . Toto chování bylo pozorováno ve verzi 2.2.1 pod Mac OS X 10.7.4.
  • Do úložiště nemůžete přidat prázdnou složku (pro vyřešení tohoto problému můžete do složky vložit libovolný soubor, například readme.txt). Toto chování je způsobeno tím, že Mercurial nesleduje složky, pouze soubory [10] . Chování je implementováno záměrně pro zjednodušení systému a zatím se neplánují žádné změny [10] .

Charakteristické rysy

Na rozdíl od git , Mercurial předpokládá přesnější model fungování, jehož nejpozoruhodnější aspekty jsou [11] [12] :

  • "Poctivé pobočky" - kteroukoli pobočku lze sledovat od samého začátku;
  • Ukládání změn ve formě revlogu (na rozdíl od blobu v git);
  • V jednom průchodu je možné sloučit pouze dvě větve (git umožňuje vícenásobné sloučení);
  • Nemožnost vrátit zpět odevzdání – místo toho byste měli odeslat opravný odevzdání, které bude překryto nad nepovedeným;
  • Silnější kontrola rozdílů se ve výchozím nastavení řídí jedním standardem, což eliminuje konflikty mezi různými verzemi a klienty.

Dodatečné prostředky

Mercurial přichází s CGI skripty, které poskytují webové rozhraní pro repozitáře [13] .

Existuje grafický shell TortoiseHg [14] , který funguje jak pod Windows (s integrací Průzkumníka), tak pod Linuxem (jako samostatná aplikace [15] nebo s integrací Gnome/Nautilus [16] ). Ve vývoji je konzolový klient hgtui pro Linux a Windows (pomocí cygwin).

Atlassian také propaguje svého klienta SourceTree , který poskytuje přístup k hg i svn a git.

Řada vývojových prostředí má funkce Mercurial, například Microsoft Visual Studio [17] [18] , IntelliJ IDEA [19] [20] [21] , Eclipse [22] , Qt Creator (od verze 2.0) [23] , PIDA [24] , NetBeans [25] . S Mercurialem je možné pracovat z Emacsu pomocí univerzálního balíčku VC, který je součástí Emacsu.

Experimentální podpora pro Mercurial je dostupná v Trac [26] . Projekt Redmine [27] také udržuje úložiště Mercurial.

Pomocí utility Tailor [28] nebo konvertorového rozšíření [29] je možné konvertovat [30] repozitáře jiných systémů pro správu verzí, včetně CVS , Subversion , Git , Perforce , Darcs , GNU Arch , Bazaar .

Projekty využívající Mercurial

Značný počet projektů vývoje svobodného softwaru používá Mercurial jako svůj primární systém pro správu verzí [31] . Mezi nimi:

Podporována jsou zrcadla Mercurial hlavních repozitářů jiných projektů [33] , jako je GCC , Vim , Emacs a linuxové jádro .

Mezi projekty, které dlouho používaly Mercurial, ale v letech 2019–2021 přešly na Git, jsou Adium , CLISP , Illumos , Coin3D , OpenJDK , SDL [34] .

Poznámky

  1. https://lkml.org/lkml/2005/4/20/45
  2. Poznámky k vydání
  3. https://www.mercurial-scm.org/repo/hg/rev/6.2.3
  4. https://www.mercurial-scm.org/wiki/Relicensing
  5. Vydání distribuovaného systému správy verzí Mercurial 2.3 . Získáno 11. března 2013. Archivováno z originálu 12. listopadu 2012.
  6. PerformancePlan - Mercurial . www.mercurial-scm.org . Datum přístupu: 15. března 2021.
  7. Porovnání Git a Mercurial v Google Code FAQ Archivováno 20. prosince 2009 na Wayback Machine 
  8. mercurial automatic push při každém potvrzení Archivováno 4. srpna 2014 na Wayback Machine 
  9. Identifikace sad změn . Získáno 12. března 2013. Archivováno z originálu 16. března 2013.
  10. 1 2 FAQ – Mercurial archivováno 26. června 2009.
  11. Podobnosti a rozdíly mezi Mercurialem a Git  (ruština) . Archivováno z originálu 2. srpna 2018. Staženo 5. června 2018.
  12. Ještě jednou o "Mercurial vs. Git" (s obrázky)  (ruština) . Archivováno z originálu 2. srpna 2018. Staženo 5. června 2018.
  13. (downlink od 04-06-13 [3437 dní] - Nastavení serveru pro práci s historií Mercurial ) (rus.)  
  14. TortoiseHg - Mercurial . Získáno 14. listopadu 2008. Archivováno z originálu 3. listopadu 2008.
  15. SourceForge.net: TortoiseHg – Vývoj  (downlink)
  16. SourceForge.net: TortoiseHg – Vývoj  (downlink)
  17. VisualHG - poskytovatel pluginu pro Microsoft Visual Studio 2008/2010 (odkaz není k dispozici) . Získáno 8. února 2009. Archivováno z originálu 5. února 2009. 
  18. HgSccPackage – plugin Mercurial pro Microsoft Visual Studio 2008/2010 (odkaz dolů) . Získáno 10. června 2010. Archivováno z originálu dne 3. července 2020. 
  19. Mercurial Integration for IDEA Archivováno 14. května 2008.
  20. hg4idea
  21. Úložiště zásuvných modulů JetBrains IntelliJ IDEA
  22. Mercurial Eclipse (downlink) . Získáno 21. července 2007. Archivováno z originálu dne 21. června 2007. 
  23. Qt Creator: Používání systémů správy verzí Archivováno 24. září 2011.
  24. Podpora Mercurial v PIDA . Získáno 21. července 2007. Archivováno z originálu dne 4. září 2007.
  25. Mercurial plugin pro NetBeans . Datum přístupu: 21. července 2007. Archivováno z originálu 15. července 2007.
  26. Mercurial Plugin pro Trac . Získáno 21. července 2007. Archivováno z originálu 3. července 2007.
  27. Úložiště v Redmine . Datum přístupu: 23. července 2010. Archivováno z originálu 29. května 2010.
  28. Tailor Archivováno 10. července 2007.
  29. ConvertExtension archivováno 25. října 2008 na Wayback Machine na Mercurial Wiki
  30. RepositoryConversion Archivováno 18. července 2007 na Wayback Machine na Mercurial Wiki
  31. Některé projekty, které používají Mercurial Archived 7. září 2008 na Wayback Machine 
  32. Reed, J Paul Přestřelka systému kontroly verzí Redux Redux (12. dubna 2007). Datum přístupu: 17. února 2019. Archivováno z originálu 17. listopadu 2012.
  33. Projekty se synchronizovanými  repozitáři Mercurial
  34. SDL se přesouvá na GitHub . diskurz.libsdl.org. Získáno 11. února 2021. Archivováno z originálu dne 10. února 2021.

Odkazy

Literatura

  • Bryan O'Sullivan. Mercurial: Definitivní průvodce. - O'Reilly Media, Inc., 2009. - 288 s. — ISBN 9780596800673 .