Mercurial

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 28 februari 2021; kontroller kräver 8 redigeringar .
Mercurial
Sorts distribuerat versionskontrollsystem [d]
Utvecklaren Matt Mackall
Skrivet i Python , C och Rust
Operativ system plattformsoberoende
Första upplagan 19 april 2005 [1]
senaste versionen
Licens GNU GPL 2+ [4]
Hemsida mercurial-scm.org
 Mediafiler på Wikimedia Commons

Mercurial (från  engelska  -  "mercury, mobile"), även känd som Hg (från beteckningen av det kemiska elementet kvicksilver ) är ett plattformsoberoende distribuerat versionskontrollsystem designat för att fungera effektivt med mycket stora kodlager . Först och främst är det ett konsolprogram .

Mercurial kom ur samma konflikt som ledde till skapandet av Git . Författaren till det nya systemet var Matt Mackall .

Beskrivning

Mercurials system är skrivet i Python , även om prestandakänsliga delar (som dess egen implementering av diff ) implementeras som tilläggsmoduler i C [5] . Rost används också för att förbättra prestandan . [6] Mercurial skrevs ursprungligen för Linux , senare portad till Windows , Mac OS X och de flesta Unix- system. Mercurials förråd hanteras med ett kommandoradsverktyg hg, men det finns också GUI.

Tillsammans med de traditionella funktionerna i versionskontrollsystem stöder Mercurial helt decentraliserat arbete (det finns inget koncept för huvudkodförrådet), förgrening (det är möjligt att upprätthålla flera grenar av ett projekt och kopiera ändringar mellan grenar), sammanslagning av arkiv (som uppnår "fördelningen" av arbetet). Stöder kommunikation mellan arkiv via HTTP / HTTPS , SSH och manuellt med paketerade ändringsuppsättningar.

Verktyget hghar ett kompakt gränssnitt, och Mercurial anses vara lättare att lära sig än till exempel git [7] .

Begrepp

Arbetsflöde

Mercurial är ett distribuerat (decentraliserat) versionskontrollsystem. Det betyder att arbetsflödet vanligtvis ser ut så här:

  1. Ett nytt arkiv skapas på persondatorn (genom att klona ett befintligt arkiv, skapa ett nytt, etc.);
  2. Filer ändras/läggs till/tar bort i arbetskatalogen för detta arkiv;
  3. Ändringarna är förbundna med detta arkiv (det vill säga till det lokala arkivet på persondatorn);
  4. Steg 2 och 3 upprepas så många gånger som behövs;
  5. Andra människors uppsättningar av förändringar tas bort (pull);
  6. Sammanfoga ändringar (sammanfoga);
  7. Ges (push) egna.

Det vill säga att allt dagligt arbete sker i det lokala förvaret och när behov uppstår skickas resultatet av deras arbete till ett eller flera andra förvar. Du kan minska antalet steg när du arbetar med fjärrlager genom att konfigurera Mercurial för att automatiskt skicka ändringar till andra förråd när en commit görs [8] .

Konsolprogram

Konsolprogrammet är implementerat på ett sådant sätt att namnet på vilket kommando som helst kan förkortas så länge dess namn förblir entydigt. Plus att vissa kommandon har alias. hg commitTill exempel kan du skriva hg commi, hg commeller istället hg com, men om du skriver hg c, så kommer Mercurial att vägra att utföra detta kommando och säger att " kommandot 'c' är tvetydigt " och ger en lista över kommandon som faller under denna förkortning. Det kan inte användas hg cosom en stenografi för hg commiteftersom det är ett alias för kommandot, hg update,men stenografin är tillgänglig hg ci.

Logisk struktur för ändringsuppsättningar

När kommandot hg commitanropas, genomförs ändringarna. Samtidigt sparar programmet en uppsättning ändringar ( engelska  changeset eller revision) i förvaret. Fysiskt sker samma ändringar som dina, men de sparas i servicefiler, och inte till en kopia (mer i Behind the scenes ).

Som regel visas alla ändringsuppsättningar som har begåtts som ett stort uppkopplat nätverk (graf), där varje ändringsuppsättning är associerad med en eller två andra.

Du kan hitta ID:n för de överordnade ändringsuppsättningarna som de bekräftade ändringsuppsättningarna är associerade med med hjälp av kommandot hg log --debug. Varje ändringsuppsättning kommer att ha två föräldrar (vilket tillåter förgrening inom förvaret, se hg -v help branch). Värdet "-1:00000000000000000000000000000000000000000000" betyder ingen förälder. Till exempel kommer den allra första ändringsuppsättningen i förvaret att ha detta värde inställt för båda föräldrarna, medan efterföljande ändringar kommer att ha detta värde inställt för den andra föräldern (såvida inte förgrening användes för dem i förvaret), och den första föräldern kommer att ha ID från föregående ändringsuppsättning.

Det är också användbart att tänka på arbetskatalogen som samma uppsättning förändringar (som ännu inte är committed, men som snart också kan committeras). Arbetskatalogen är också associerad med en eller två överordnade ändringar, som kan hittas med kommandot hg parents. Efter att ändringarna har genomförts kommer dessa föräldrar att bli föräldrar för den nya (redan beslutade) förändringsuppsättningen.

Identifiera ändringar

Revisioner känns igen av följande funktioner [9] :

Revisionsnummer

Revisionsnumret är ett heltal som representerar den ordning i vilken ändringar lades till i arkivet. Revisionsnumret börjar på noll, tilldelas automatiskt en förändringsuppsättning och kan användas för att identifiera förändringsuppsättningar. Revisionsnumret för samma ändringsuppsättning kan vara olika i varje förvarsklon. I utgången av kommandot hg logkan revisionsnumret ses före kolon (till exempel "4: e1be1898f374").

Ändringsuppsättnings-ID

Ändringsuppsättningens ID är en SHA-1-hash som består av siffror och bokstäverna "a, b, c, d, e, f", till exempel "e1be1898f3747386c41c8a5c5776e87373f6d3d3". Ett ändringsuppsättnings-ID tilldelas automatiskt till varje ändringsuppsättning, beräknat från innehållet i den ändringsuppsättningen, och motsvarar därför samma ändringsuppsättning i alla arkiv. Sannolikheten för en kollision, när samma SHA-1-hash genereras för två olika ändringsuppsättningar, är extremt liten.

Mercurial kräver inte hela identifierarsträngen när den används i kommandon, den behöver bara den första delen av den som unikt identifierar den önskade ändringsuppsättningen (annars kommer Mercurial att rapportera en tvetydighet). I kommandoutgången hg logkan ändringsuppsättnings-ID:t ses efter kolon (till exempel "4:e1be1898f374"). Utan en parameter matar --debugkommandot hg loginte ut hela, utan en förkortad (med 12 tecken) ändringsuppsättningsidentifierare.

Taggar

Förutom revisionsnumret och ändringsuppsättnings-ID ger Mercurial möjligheten att ge varje ändringsuppsättning ett eller flera godtyckliga symboliska namn, kallade taggar (eller taggar ). Etiketter tilldelas med kommandot hg tag, och du kan se alla tillagda etiketter med kommandot hg tags. Etikettnamnet kan inte innehålla vissa tecken (till exempel ": "), som Mercurial kommer att rapportera när kommandot utförs vid behov hg tag.

Där ett ändringsuppsättnings-ID kan anges i kommandon, kan etikettnamnet ersättas.

Filialnamn

Varje gren har sitt eget namn. Det anges när grenen skapas och ändras aldrig igen.

Icke-uppenbara ögonblick

  • Om ett nummer skickas till ett kommando som ett revisions-ID, kommer Mercurial att anta att det har fått ett revisionsnummer och kommer endast att disambiguera med det förkortade ändringsuppsättnings-ID:t om det inte finns någon ändringsuppsättning med det givna revisionsnumret. Till exempel, om förvaret har en ändringsuppsättning med revisionsnummer "6" och en annan ändringsuppsättning med id "647362ac74d76124267215af1a3f94aa9707dfdf" (börjar med siffran "6"), då kommer kommandot hg log -r 6att mata ut information om den första ändringsuppsättningen utan att rapportera tvetydigheten. Därför, om en global identifierare börjar med en siffra, är det användbart att alltid förkorta den endast tills den innehåller en bokstav. Detta beteende observerades i version 2.2.1 under Mac OS X 10.7.4.
  • Om du skapar en tagg med ett namn som "5" medan det finns (eller kommer att finnas i framtiden) en ändringsuppsättning med versionsnummer "5" i förvaret, kommer Mercurial att leta efter ändringar efter versionsnummer först. Men om du skapar en tagg med ett namn som "e1be" medan det finns (eller kommer att finnas i framtiden) en ändringsuppsättning i förvaret med ett ändringsuppsättnings-ID som börjar med "e1be", så kommer Mercurial att leta efter ändringar efter taggar först. . Dessutom kommer oklarheten inte att rapporteras i båda fallen. Av denna anledning rekommenderas det inte att skapa etiketter som endast består av siffror och/eller bokstäver "a, b, c, d, e, f" . Detta beteende observerades i version 2.2.1 under Mac OS X 10.7.4.
  • Du kan inte lägga till en tom mapp till förvaret (för att lösa detta problem kan du lägga vilken fil som helst i mappen, till exempel readme.txt). Detta beteende beror på att Mercurial inte spårar mappar, bara filer [10] . Beteendet är implementerat medvetet för att förenkla systemet och än så länge är inga förändringar planerade [10] .

Utmärkande egenskaper

Till skillnad från git antar Mercurial en mer rigorös funktionsmodell, vars mest anmärkningsvärda aspekter är [11] [12] :

  • "Ärliga grenar" - vilken gren som helst kan spåras från början;
  • Lagra ändringar i form av en revlog (i motsats till blob in git);
  • Det är möjligt att slå samman endast två grenar i ett pass (git tillåter flera sammanslagningar);
  • Omöjlighet att ångra en commit - istället bör du skicka en korrigerande commit, som kommer att läggas ovanpå den misslyckade;
  • Starkare diffkontroll följer en enda standard som standard, vilket eliminerar konflikter mellan olika versioner och klienter.

Ytterligare medel

Mercurial kommer med CGI-skript för att tillhandahålla ett webbgränssnitt till arkiven [13] .

Det finns ett grafiskt skal TortoiseHg [14] som fungerar både under Windows (med Explorer-integration) och under Linux (som en separat applikation [15] eller med Gnome/Nautilus- integration [16] ). Det finns en hgtui -konsolklient under utveckling för Linux och Windows (med cygwin).

Atlassian marknadsför också sin SourceTree- klient , som ger tillgång till både hg och svn och git.

Ett antal utvecklingsmiljöer har Mercurial-funktioner, såsom Microsoft Visual Studio [17] [18] , IntelliJ IDEA [19] [20] [21] , Eclipse [22] , Qt Creator (sedan version 2.0) [23] , PIDA [24] , NetBeans [25] . Det är möjligt att arbeta med Mercurial från Emacs med det universella VC-paketet som ingår i Emacs.

Experimentellt stöd för Mercurial finns tillgängligt i Trac [26] . Redmine - projektet [27] underhåller också Mercurial-förråden.

Med hjälp av Tailor-verktyget [28] eller konverteringstillägget [29] är det möjligt att konvertera [30] arkiv för andra versionskontrollsystem, inklusive CVS , Subversion , Git , Perforce , Darcs , GNU Arch , Bazaar .

Projekt som använder Mercurial

Ett betydande antal friprogramvaruutvecklingsprojekt använder Mercurial som sitt primära versionskontrollsystem [31] . Bland dem:

Mercurial speglar av huvudarkiven för andra projekt [33] stöds , såsom GCC , Vim , Emacs och Linux-kärnan .

Bland projekten som använt Mercurial under lång tid, men bytte till Git 2019-2021, är Adium , CLISP , Illumos , Coin3D , OpenJDK , SDL [34] .

Anteckningar

  1. https://lkml.org/lkml/2005/4/20/45
  2. Release Notes
  3. https://www.mercurial-scm.org/repo/hg/rev/6.2.3
  4. https://www.mercurial-scm.org/wiki/Relicensing
  5. Utgivning av det distribuerade versionskontrollsystemet Mercurial 2.3 . Hämtad 11 mars 2013. Arkiverad från originalet 12 november 2012.
  6. PerformancePlan - Mercurial . www.mercurial-scm.org . Tillträdesdatum: 15 mars 2021.
  7. Jämförelse av Git och Mercurial i Google Code FAQ Arkiverad 20 december 2009 på Wayback Machine 
  8. mercurial automatisk push på varje commit Arkiverad 4 augusti 2014 på Wayback Machine 
  9. Identifiering av förändringsuppsättningar . Hämtad 12 mars 2013. Arkiverad från originalet 16 mars 2013.
  10. 1 2 FAQ - Mercurial Arkiverad 26 juni 2009.
  11. Likheter och skillnader mellan Mercurial och Git  (ryska) . Arkiverad från originalet den 2 augusti 2018. Hämtad 5 juni 2018.
  12. Än en gång om "Mercurial vs. Git" (med bilder)  (ryska) . Arkiverad från originalet den 2 augusti 2018. Hämtad 5 juni 2018.
  13. (nedlänk sedan 04-06-13 [3437 dagar] - Konfigurera en server för att fungera med Mercurial- historik ) (rys.)  
  14. TortoiseHg - Mercurial . Hämtad 14 november 2008. Arkiverad från originalet 3 november 2008.
  15. SourceForge.net: TortoiseHg - Utveckla  (nedlänk)
  16. SourceForge.net: TortoiseHg - Utveckla  (nedlänk)
  17. VisualHG - plugin-leverantör för Microsoft Visual Studio 2008/2010 (länk ej tillgänglig) . Hämtad 8 februari 2009. Arkiverad från originalet 5 februari 2009. 
  18. HgSccPackage - Mercurial-plugin för Microsoft Visual Studio 2008/2010 (nedlänk) . Hämtad 10 juni 2010. Arkiverad från originalet 3 juli 2020. 
  19. Mercurial Integration för IDEA Arkiverad 14 maj 2008.
  20. hg4idea
  21. JetBrains IntelliJ IDEA Plugin Repository
  22. Mercurial Eclipse (nedlänk) . Hämtad 21 juli 2007. Arkiverad från originalet 21 juni 2007. 
  23. Qt Creator: Använda versionskontrollsystem Arkiverad 24 september 2011.
  24. Kvicksilverstöd i PIDA . Hämtad 21 juli 2007. Arkiverad från originalet 4 september 2007.
  25. Mercurial-plugin för NetBeans . Tillträdesdatum: 21 juli 2007. Arkiverad från originalet 15 juli 2007.
  26. Mercurial Plugin för Trac . Hämtad 21 juli 2007. Arkiverad från originalet 3 juli 2007.
  27. Förvar i Redmine . Tillträdesdatum: 23 juli 2010. Arkiverad från originalet den 29 maj 2010.
  28. Skräddare arkiverad 10 juli 2007.
  29. ConvertExtension Arkiverad 25 oktober 2008 på Wayback Machine på Mercurial Wiki
  30. RepositoryConversion Arkiverad 18 juli 2007 på Wayback Machine på Mercurial Wiki
  31. Några projekt som använder Mercurial Arkiverad 7 september 2008 på Wayback Machine 
  32. Reed, J Paul Version Control System Shootout Redux Redux (12 april 2007). Datum för åtkomst: 17 februari 2019. Arkiverad från originalet den 17 november 2012.
  33. Projekt med synkroniserade Mercurial-  förråd
  34. SDL flyttar till GitHub . discourse.libsdl.org. Hämtad 11 februari 2021. Arkiverad från originalet 10 februari 2021.

Länkar

Litteratur

  • Bryan O'Sullivan. Mercurial: The Definitive Guide. - O'Reilly Media, Inc., 2009. - 288 sid. — ISBN 9780596800673 .