Pažintis su Mercurial

Data: 2008-06-25

Tipinė grupėje dirbančio programuotojo priemonė yra SCM'as (šaltinio kodo valdymo sistema). Tiesa sakant, jei net grupėje nedirbate apie tai verta pagalvoti taip pat. Iki šiol (sąlyginai) buvo paplitusios tradicinės centralizuotos sistemos (CVS, Subversion ar dar baisesni variantai). Tokiu atveju visas kodas laikomos viename centriniame serveryje ir žmonės pasidaro tik tam tikrą informacijos kiekį turinčią kopiją savo kompiuteryje. Pvz.: CVS'o atveju tai labai apsunkina darbą su nutolusiais serveriais, subversion ši problema šiek tiek mažesnė, bet kyla kitų problemų.

Šiuo metu pradėjo populiarėti decentralizuotos kodo valdymo sistemos (keli verti paminėjimo vardai Git, Bazaar ir Mercurial). Tokiu atveju iš esmės reiškia, kad visą kodo repozitoriją (grubiai kodas + detali pakeitimų istorija) laikai savo kompiuteryje. Čia aš nedetalizuosiu kokie tokių sistemų pranašumai jas lyginant su centralizuotomis, bet jų tikrai netrūksta (ir beje tai ne tik technika, tai ir filosofija). Pradžiai galite tiesiog pažiūrėti Linus Torvalds (Linux autoriaus) kalbą apie Git:


Dėl tam tikrų aplinkybių aš pasirinkau Mercurial'ą http://www.selenic.com/mercurial/wiki/ ir į kitus variantus net nežiūrėjau. Git'as jums gali netikti, nes yra tik linux'inis (nors šiek tiek padirbėjus galima naudoti ir Windows'uose). Apie bazaar'ą apskritai nieko negaliu pasakyti (mačiau tik problemų sąrašą, kuris dabar jau tikriausiai sutvarkytas).

Viena priežasčių kodėl išvis perėjau prie decentralizuotos sistemos yra labai banali - neturėjau interneto tam tikrose situacijose. Mano darbas atrodė maždaug taip:

  • Darom pakeitimus
  • Klonuojame repozitoriją arba stumiame pakeitimus į USB raktą
  • Pakeitimus iš USB rakto stumiame į repozitoriją
  • Ir atgal

Beje dirbau prie dviejų skirtingų operacinių sistemų (Ubuntu ir Windows). Mercurial'as šią problemą išsprendė.

Visas darbas su mercurial'u komandinėje eilutėje atrodo maždaug taip:

# pasiimame pakeitimus
hg pull
# atnaujiname kodą
hg up
# jei pakeitimus reikia apjungti su esančiu kodu darome
hg merge
hg ci
# pats darbas atrodo maždaug taip (čia daug daug kartų kartojame)
# dažniausiai kitų komandų ir neprireikia
hg st
hg diff
hg vdiff
hg add
hg ci
# darbo pabaigoje nepamirštame pakeitimų perkelti į pagrindinę kodo vietą
hg push

Beje bash'as (kuris yra default'as Ubuntu) labai gražiai su Mercurial'u bendrauja ir jei reikia pridėti ar sucommit'inti tik konkretų failą auto-complete funkcija veikia idealiai (jei parašyčiau šitą sakinį lietuvių kalba manęs niekas nesuprastų). Mercurial visai neblogai veikia su SSH, 0.9.5 turėjo problemą, kad negalima klonuoti repozitorijos į išorinį serverį, bet tai nėra didelė problema. Deja nežinau ar ši problema jau išspręsta.

Kadangi dar nežinau kaip viskas vyktų naudojant tai komandoje, tai galiu išvardinti pliusus dirbant tiesiog asmeniškai:

  • Greitis, nes repozitorija kompiuteryje. Man sunkiausia buvo priprasti prie greito commit'o.
  • Galima vystyti kelias nepriklausomas šakas, jei staiga reikia ištaisyti kažkokią klaidą. Po to tas šakas nebus sunku apjungti.
  • Repozitorijos konvertavimas iš Subversion labai neskausmingas.
  • Web interface'as greitas ir labai šauniai konfigūruojamas
  • Idealiai veikia su SSH, kas man aktualu.

Pažintį su Mercurial'u rekomenduoju pradėti nuo šios nemokamos knygos http://hgbook.red-bean.com/hgbook.html