Mercurial

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 28. februar 2021; checks kræver 8 redigeringer .
Mercurial
Type distribueret versionskontrolsystem [d]
Udvikler Matt Mackall
Skrevet i Python , C og Rust
Operativ system på tværs af platforme
Første udgave 19. april 2005 [1]
nyeste version
Licens GNU GPL 2+ [4]
Internet side mercurial-scm.org
 Mediefiler på Wikimedia Commons

Mercurial (fra  engelsk  -  "mercury, mobile"), også kendt som Hg (fra betegnelsen af ​​det kemiske grundstof mercury ) er et distribueret versionskontrolsystem på tværs af platforme designet til at arbejde effektivt med meget store kodelagre . Først og fremmest er det et konsolprogram .

Mercurial kom ud af den samme konflikt, der førte til skabelsen af ​​Git . Forfatteren af ​​det nye system var Matt Mackall .

Beskrivelse

Mercurials system er skrevet i Python , selvom ydeevnefølsomme dele (såsom dets egen implementering af diff ) er implementeret som udvidelsesmoduler i C [5] . Rust bruges også til at forbedre ydeevnen . [6] Mercurial blev oprindeligt skrevet til Linux , senere porteret til Windows , Mac OS X og de fleste Unix- systemer. Mercurials repositories administreres med et kommandolinjeværktøj hg, men der er også GUI'er.

Sammen med de traditionelle funktioner i versionskontrolsystemer understøtter Mercurial fuldstændigt decentralt arbejde (der er intet koncept for hovedkodelageret), forgrening (det er muligt at vedligeholde flere grene af et projekt og kopiere ændringer mellem grene), flettedepoter (som opnår "fordelingen" af arbejdet). Understøtter kommunikation mellem repositories via HTTP / HTTPS , SSH og manuelt ved hjælp af pakkede ændringssæt.

Hjælpeprogrammet hghar en kompakt grænseflade, og Mercurial anses for at være lettere at lære end for eksempel git [7] .

Begreber

Arbejdsgang

Mercurial er et distribueret (decentraliseret) versionskontrolsystem. Det betyder, at arbejdsgangen typisk ser sådan ud:

  1. Et nyt lager oprettes på den personlige computer (ved at klone et eksisterende lager, oprette et nyt osv.);
  2. Filer ændres/tilføjes/slettes i arbejdsbiblioteket i dette lager;
  3. Ændringerne er forpligtet til dette lager (det vil sige til det lokale lager på den personlige computer);
  4. Trin 2 og 3 gentages så mange gange som nødvendigt;
  5. Andre menneskers sæt af ændringer tages væk (pull);
  6. Flet ændringer (flet);
  7. Er givet (push) egne.

Det vil sige, at alt det daglige arbejde foregår i det lokale depot, og når behovet opstår, sendes resultaterne af deres arbejde til et eller flere andre depoter. Du kan reducere antallet af trin, når du arbejder med eksterne repositories ved at konfigurere Mercurial til automatisk at skubbe ændringer til andre repositories, når der foretages en commit [8] .

Konsolprogram

Konsolprogrammet er implementeret på en sådan måde, at navnet på enhver kommando kan forkortes, så længe dens navn forbliver utvetydigt. Plus nogle kommandoer har aliaser. hg commitFor eksempel kan du skrive hg commi, hg commeller i stedet hg com, men hvis du skriver hg c, så vil Mercurial nægte at udføre denne kommando, idet han siger, at " kommando 'c' er tvetydig " og giver en liste over kommandoer, der falder ind under denne forkortelse. Det kan ikke bruges hg cosom en stenografi for hg commit, fordi det er et alias for kommandoen, hg update,men stenografien er tilgængelig hg ci.

Logisk struktur af ændringssæt

Når kommandoen hg commitpåkaldes, er ændringerne begået. Samtidig gemmer programmet et sæt ændringer ( engelsk  changeset eller revision) til repository. Fysisk sker de samme ændringer som dine, men de gemmes i servicefiler, og ikke til en kopi (mere i Bag kulisserne ).

Som regel vises alle ændringssæt, der er blevet begået, som et stort tilsluttet netværk (graf), hvor hvert ændringssæt er knyttet til et eller to andre.

Du kan finde ID'erne for de overordnede ændringssæt, som de forpligtede ændringssæt er knyttet til ved hjælp af kommandoen hg log --debug. Hvert ændringssæt vil have to forældre (hvilket tillader forgrening inden for depotet, se hg -v help branch). Værdien "-1:0000000000000000000000000000000000000000000" betyder ingen forælder. For eksempel vil det allerførste ændringssæt i depotet have denne værdi indstillet til begge forældre, mens efterfølgende ændringssæt vil have denne værdi sat til den anden forælder (medmindre forgrening blev brugt til dem i lageret), og den første forælder vil have ID fra det forrige ændringssæt.

Det er også nyttigt at tænke på arbejdsbiblioteket som det samme sæt ændringer (som endnu ikke er commited, men snart også kan commited). Arbejdsbiblioteket er også forbundet med et eller to overordnede ændringssæt, som kan findes med kommandoen hg parents. Når ændringerne er begået, bliver disse forældre forældre til det nye (allerede forpligtede) ændringssæt.

Identifikation af ændringssæt

Revisioner genkendes af følgende funktioner [9] :

Revisionsnummer

Revisionsnummeret er et heltal, der repræsenterer den rækkefølge, som ændringssæt blev tilføjet til lageret. Revisionsnummeret starter ved nul, tildeles automatisk til et ændringssæt og kan bruges til at identificere ændringssæt. Revisionsnummeret for det samme ændringssæt kan være forskelligt i hver repository klon. I outputtet af kommandoen hg logkan revisionsnummeret ses før kolon (f.eks. "4: e1be1898f374").

Ændringssæt ID

Ændringssæt-id'et er en SHA-1-hash bestående af tal og bogstaverne "a, b, c, d, e, f", for eksempel "e1be1898f3747386c41c8a5c5776e87373f6d3d3". Et ændringssæt-id tildeles automatisk til hvert ændringssæt, beregnet ud fra indholdet af det ændringssæt, og svarer derfor til det samme ændringssæt i alle lagre. Sandsynligheden for en kollision, når den samme SHA-1-hash genereres for to forskellige ændringssæt, er ekstremt lille.

Mercurial kræver ikke den fulde identifikatorstreng, når den bruges i kommandoer, den behøver kun den indledende del af den, der unikt identificerer det ønskede ændringssæt (ellers vil Mercurial rapportere en tvetydighed). I kommandooutputtet hg logkan ændringssæt-id'et ses efter kolon (f.eks. "4:e1be1898f374"). Uden en parameter udsender --debugkommandoen hg logikke den fulde, men en forkortet (på 12 tegn) ændringssætidentifikator.

Tags

Ud over revisionsnummeret og ændringssæt-id'et giver Mercurial mulighed for at give hvert ændringssæt et eller flere vilkårlige symbolske navne, kaldet tags (eller tags ). Etiketter tildeles ved hjælp af kommandoen hg tag, og du kan se alle tilføjede etiketter ved hjælp af kommandoen hg tags. Etiketnavnet kan ikke indeholde nogle tegn (for eksempel ": "), som Mercurial vil rapportere, når kommandoen udføres, hvis det er nødvendigt hg tag.

Hvor et ændringssæt-ID kan angives i kommandoer, kan etiketnavnet erstattes.

Filialnavn

Hver gren har sit eget navn. Det er angivet, hvornår grenen oprettes og ændres aldrig igen.

Ikke-oplagte øjeblikke

  • Hvis et nummer videregives til en kommando som et revisions-id, vil Mercurial antage, at det har fået et revisionsnummer og vil kun udelukke med det forkortede ændringssæt-ID, hvis der ikke er noget ændringssæt med det givne revisionsnummer. For eksempel, hvis lageret har et ændringssæt med revisionsnummer "6" og et andet ændringssæt med id "647362ac74d76124267215af1a3f94aa9707dfdf" (begynder med tallet "6"), så vil kommandoen hg log -r 6udsende information om det første ændringssæt uden at rapportere tvetydigheden. Derfor, hvis en global identifikator starter med et ciffer, er det nyttigt altid kun at forkorte det, indtil det indeholder et bogstav. Denne adfærd blev observeret i version 2.2.1 under Mac OS X 10.7.4.
  • Hvis du opretter et tag med et navn som "5", mens der er (eller vil være i fremtiden) et ændringssæt med revisionsnummer "5" i repository, så vil Mercurial først lede efter ændringssæt efter revisionsnummer. Men hvis du opretter et tag med et navn som "e1be", mens der er (eller vil være i fremtiden) et ændringssæt i lageret med et ændringssæt-id, der starter med "e1be", så vil Mercurial først lede efter ændringssæt efter tags. . I begge tilfælde vil tvetydigheden desuden ikke blive rapporteret. Af denne grund anbefales det ikke at oprette etiketter, der kun består af tal og/eller bogstaver "a, b, c, d, e, f" . Denne adfærd blev observeret i version 2.2.1 under Mac OS X 10.7.4.
  • Du kan ikke tilføje en tom mappe til depotet (for at løse dette problem kan du lægge en hvilken som helst fil i mappen, f.eks. readme.txt). Denne adfærd skyldes, at Mercurial ikke sporer mapper, kun filer [10] . Adfærden er implementeret bevidst for at forenkle systemet og indtil videre er der ikke planlagt nogen ændringer [10] .

Karakteristiske træk

I modsætning til git antager Mercurial en mere stringent operationsmodel, hvoraf de mest bemærkelsesværdige aspekter er [11] [12] :

  • "Ærlige grene" - enhver gren kan spores helt fra begyndelsen;
  • Lagring af ændringer i form af en revlog (i modsætning til blob i git);
  • Det er muligt kun at flette to forgreninger i én gang (git tillader flere fletninger);
  • Umulighed at fortryde en commit - i stedet skal du sende en korrigerende commit, som vil blive overlejret oven på den mislykkede;
  • Stærkere forskelskontrol følger som standard en enkelt standard, hvilket eliminerer konflikter mellem forskellige versioner og klienter.

Yderligere midler

Mercurial kommer med CGI-scripts for at give en webgrænseflade til lagrene [13] .

Der er en grafisk skal TortoiseHg [14] , der fungerer både under Windows (med Explorer-integration) og under Linux (som en separat applikation [15] eller med Gnome/Nautilus- integration [16] ). Der er en hgtui - konsolklient under udvikling til Linux og Windows (ved hjælp af cygwin).

Atlassian promoverer også sin SourceTree- klient , som giver adgang til både hg og svn og git.

En række udviklingsmiljøer har Mercurial-funktioner, såsom Microsoft Visual Studio [17] [18] , IntelliJ IDEA [19] [20] [21] , Eclipse [22] , Qt Creator (siden version 2.0) [23] , PIDA [24] , NetBeans [25] . Det er muligt at arbejde med Mercurial inde fra Emacs ved hjælp af den universelle VC-pakke, der følger med Emacs.

Eksperimentel støtte til Mercurial er tilgængelig i Trac [26] . Redmine- projektet [27] vedligeholder også Mercurial-depoterne.

Ved at bruge Tailor-værktøjet [28] eller konverteringsudvidelsen [29] er det muligt at konvertere [30] arkiver af andre versionskontrolsystemer, inklusive CVS , Subversion , Git , Perforce , Darcs , GNU Arch , Bazaar .

Projekter, der bruger Mercurial

Et betydeligt antal gratis softwareudviklingsprojekter bruger Mercurial som deres primære versionskontrolsystem [31] . Blandt dem:

Mercurial spejle af de vigtigste lagre i andre projekter [33] er understøttet , såsom GCC , Vim , Emacs og Linux-kernen .

Blandt de projekter, der brugte Mercurial i lang tid, men skiftede til Git i 2019-2021, er Adium , CLISP , Illumos , Coin3D , OpenJDK , SDL [34] .

Noter

  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. Frigivelse af det distribuerede versionskontrolsystem Mercurial 2.3 . Hentet 11. marts 2013. Arkiveret fra originalen 12. november 2012.
  6. PerformancePlan - Mercurial . www.mercurial-scm.org . Dato for adgang: 15. marts 2021.
  7. Sammenligning af Git og Mercurial i Google Code FAQ Arkiveret 20. december 2009 på Wayback Machine 
  8. mercurial automatisk tryk på hver commit Arkiveret 4. august 2014 på Wayback Machine 
  9. Identifikation af ændringssæt . Hentet 12. marts 2013. Arkiveret fra originalen 16. marts 2013.
  10. 1 2 FAQ - Mercurial Arkiveret 26. juni 2009.
  11. Ligheder og forskelle mellem Mercurial og Git  (russisk) . Arkiveret fra originalen den 2. august 2018. Hentet 5. juni 2018.
  12. Endnu en gang om "Mercurial vs. Git" (med billeder)  (russisk) . Arkiveret fra originalen den 2. august 2018. Hentet 5. juni 2018.
  13. (downlink siden 04-06-13 [3437 dage] - Opsætning af en server til at arbejde med Mercurial historie ) (rus.)  
  14. SkildpaddeHg - Mercurial . Hentet 14. november 2008. Arkiveret fra originalen 3. november 2008.
  15. SourceForge.net: TortoiseHg - Develop  (downlink)
  16. SourceForge.net: TortoiseHg - Develop  (downlink)
  17. VisualHG - plugin-udbyder til Microsoft Visual Studio 2008/2010 (link ikke tilgængeligt) . Hentet 8. februar 2009. Arkiveret fra originalen 5. februar 2009. 
  18. HgSccPackage - Mercurial-plugin til Microsoft Visual Studio 2008/2010 (downlink) . Hentet 10. juni 2010. Arkiveret fra originalen 3. juli 2020. 
  19. Mercurial Integration for IDEA Arkiveret 14. maj 2008.
  20. hg4idea
  21. JetBrains IntelliJ IDEA Plugin Repository
  22. Mercurial Eclipse (downlink) . Hentet 21. juli 2007. Arkiveret fra originalen 21. juni 2007. 
  23. Qt Creator: Brug af versionskontrolsystemer Arkiveret 24. september 2011.
  24. Mercurial støtte i PIDA . Hentet 21. juli 2007. Arkiveret fra originalen 4. september 2007.
  25. Mercurial plugin til NetBeans . Dato for adgang: 21. juli 2007. Arkiveret fra originalen den 15. juli 2007.
  26. Mercurial Plugin til Trac . Hentet 21. juli 2007. Arkiveret fra originalen 3. juli 2007.
  27. Repositories i Redmine . Dato for adgang: 23. juli 2010. Arkiveret fra originalen den 29. maj 2010.
  28. Skrædder arkiveret 10. juli 2007.
  29. ConvertExtension arkiveret 25. oktober 2008 på Wayback Machine på Mercurial Wiki
  30. RepositoryConversion Arkiveret 18. juli 2007 på Wayback Machine på Mercurial Wiki
  31. Nogle projekter, der bruger Mercurial Arkiveret 7. september 2008 på Wayback Machine 
  32. Reed, J Paul Version Control System Shootout Redux Redux (12. april 2007). Dato for adgang: 17. februar 2019. Arkiveret fra originalen 17. november 2012.
  33. Projekter med synkroniserede Mercurial-  depoter
  34. SDL flytter til GitHub . discourse.libsdl.org. Hentet 11. februar 2021. Arkiveret fra originalen 10. februar 2021.

Links

Litteratur

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