Revision 11 as of 2012-02-26 17:36:29

Clear message

Varíme z ortuti, zdravo, rýchlo a lacno

Spisovateľ práve zasadol za svoj pracovný stôl. Pravou rukou vytiahol zásuvku a z nej zväzok s materiálmi na ktorých v poslednej dobe pracuje. Našiel ich presne v tom stave, v ktorom ich včera zanechal. Okrem práce, ktorú na nich urobil včera je v nich vidno celú históriu postupného pripisovania, prepisovania, pridávania a škrtania. V tých papieroch je celá história zmien, ktoré doteraz vykonal. Má to jednu výhodu: ak niekedy nadobudne pocit, že pred mesiacom sa jeho práca nachádzala v lepšom stave než dnes, môže sa k stavu z pred mesiaca okamžite vrátiť a nadviazať naň.

Programátor práve zasadol za svoj počítač. V editore otvoril zdrojový kód projektu na ktorom v poslednej dobe pracuje. Našiel ho presne v tom stave, v ktorom ho včera zanechal. Programátor, na rozdiel od svojho kolegu spisovateľa, nevidí v akom stave sa projekt nachádzal pred týždňom alebo pred mesiacom. Programátor je nervózny: ešte predvčerom bol program funkčný ale včera ho začal živelne modifikovať v dôsledku čoho program znefunkčnil. Navyše, snažiac sa zachrániť čo najviac, programátor znervóznel a v strese zaniesol do kódu ešte ďalšie chyby. Čo by dal programátor za to, keby sa mohol vrátiť k predvčerajšej verzii kódu. Dalo by sa to spraviť, keby si programátor jednotlivé verzie zálohoval. Lenže zálohovanie je prácne a len málo kto je dostatočne disciplinovaný na to, aby zálohoval denne. Náš programátor by to mal na svete oveľa jednoduchšie, keby používal nejaký systém správy verzií. Napríklad mercurial.

Táto stránka je písaná pre tých, ktorí Mercurial nikdy nevideli v akcii ale potrebujú ho používať. Hlboké porozumenie ktorémukoľvek systému správy verzií (zďaleka nie len Mercurialu) vyžaduje uchopenie veľkého množstva abstraktných pojmov. Vďaka tomu začiatočník snažiaci sa preniknúť k podstate trpí. Komenský vraj hovorieval, že učiači sa človek si najprv osvojí prízemné aspekty veci a až potom (ak vôbec) je pripravený začať o veci rozmýšlať. Pretože s týmto názorom súhlasím, a pretože Mercurial je z môjho hladiska iba nástroj, rozhodol som sa napísať tento tutoriál, ktorý celú problematiku Mercurialu vysvetluje na niekoľkých jednoduchých receptoch. S takýmto prístupom k vysvetlovaniu vecí polemizuje názor, podľa ktorého je redukcia akéhokoľvek problému na sadu receptov neprípustná trivializácia vhodná nanajvýš tak pre cvičené opice. Názor je to síce stále menej populárny, je na ňom však veľký kus pravdy. A preto... ak čitateľa tutoriál uráža je to neklamný znak, že tento text nie je určený preňho. Jemu odporáčam nazrieť do niektorého spomedzi tisícok iných online textov, ktoré mercurial vysvetlujú na civilizovanej úrovni.

Založenie nového repozitára (init)

Nepríčetný programátor má projekty na ktorých pracuje nahádzané všetky v jednom adresári. Ešte nepríčetnejší programátor ich drží v jednom súbore. Je to vynikajúci nápad - z projektov takto na filesystéme vzniká pôsobivá a chutná bouillabaisse. Nepríčetný programátor už zmysel života našiel a s kľudným svedomím môže v tomto bode prestať čítať. Čokoľvek.

Príčetný programátor má projekty na ktorých pracuje porozdelované do adresárov. Ešte príčetnejší programátor má aj jednotlivé tieto adresáre ďalej rozdelené na podadresáre. Tieto môžu byť, napríklad, podadresár na všetky zdrojové kódy, špeciálny podadresár na dáta s ktorými program pracuje, alebo podadresár s dokumentáciou. Tu vysvetlíme, čo má príčetný programátor urobiť, aby zabezpečil, že mercurial začne sledovať a pamätať si zmeny a postupný vývin jedného konkrétneho projektu. Ak nie je povedané inak, všetky úkony v tomto tutoriáli spočívajú v spúštaní príkazov z príkazového riadku.

1. V prvom rade treba nastaviť aktuálny pracovný adresár na ten adresár v ktorom sa nachádza projekt, ktorý chceme mercurialom sledovať. Ak sa napríklad programátor rozhodne, že chce sledovať projekt v adresári aaa/bbb/ccc, prvý úkon v príkazovom riadku by mal vyzerať takto:

cd aaa/bbb/ccc

2. Teraz nastal ten okamih, kedy treba mercurialu oznámiť, že zmeny v tomto adresári má sledovať. Docieli sa to takto (všimnite si, že všetky mercurialovské úkony spočívajú vo volaní príkazu hg):

hg init

Práve ste vytvorili mercurialovský repozitár. Od tohoto okamihu mercurial sleduje všetky zmeny v ktorom koľvek súbore v tomto adresári alebo jeho lubovoľne hlboko vnorenom podadresári. Ak sa teraz pozriete na obsah aktuálneho adresára, všimnete si, že v ňom pribudol podadresár .hg - tu si mercurial drží všetky potrebné informácie o histórii zmien ale aj konfiguračné informácie, ktoré definujú ako sa má mercurial správať v niektorých situáciach.

3A. Ešte pred tým, než začneme mercurial naplno využívať, oplatí sa investovať trošku času do dvoch kozmetických úprav. Prvá spočíva v doladení už vyššie spomenutých konfiguračných informácií. Predpokladajme, že programátor sa volá Jožko Mrkvička a práve sedí za počítačom, ktorému on, Jožko Mrkvička, hovorí zajax. Programátor zájde do už spomenutého podadresára .hg a vytvorí, edituje a uloží tam súbor hgrc pričom doňho pridá zhruba takéto riadky:

[ui]
username = jozef.mrqicka@zajax
verbose  = True

Nie je nijako extrémne dôležité, ako presne vyzerá reťazec definujúci username. Úplne postačí ak je z reťazca nejako zrejmé komu repozitár patrí a na ktorom počítači sa repozitár nachádza. Na čo je to celé dobré vysvitne neskôr.

To čo sme tu práve popísali predstavuje nutné minimum nastavení, ktoré treba vykonať na začiatku, hneď po založení repozitáru. Samozrejme, okrem týchto nastavení možno ponastavovať množstvo iných úžasných vecí o ktorých tento tutoriál mlčí.

3B. Mercurial je dôsledný. Ak mu to nezakážete, bude sa snažiť sledovať zmeny v úplne všetkých súboroch v repozitári. Takéto správanie vie byť v istých situáciach otravné - niekedy vyslovene chcete, aby si niektoré súbory mercurial radšej nevšímal, lebo na ich zmenách vôbec nezáleží. Príkladom takých súborov, ak programujete v jazyku C, sú objektové súbory (tie s koncovkou .o) alebo definitívny výsledok prekladu (výsledný spustitelný súbor). Tieto veci sledovať netreba, pretože ak máte k dispozícii zdrojové kódy, stačí ich skompilovať a máte aj vyššie spomenuté. Ako mercurialu zkážete sledovať niektoré súbory? Slúži na to konfiguračný súbor .hgignore. Tento súbor sa v repozitári musí nachádzať v jeho najuvyššom adresári, hneď vedľa adresára .hg, ktorému sme sa venovali v predchádzajúcom paragrafe. V našom prípade je ním adresár aaa/bbb/ccc. Ukážkový súbor .hgignore by mohol vyzerať napríklad takto:

/.*\.o$
/bin/program$
/data/

Zdá sa, že náš fiktívny hrdina, Jožko Mrkvička, sa rozhodol ignorovať úplne všetky súbory s koncovkou .o (prvý riadok), ďalej súbor program v podadresári bin (druhý riadok) a napokon úplne všetko čo je v podadresári data a v ktoromkoľvek jeho podadresári. Je jasné, že váš súbor .hgignore nemusí vyzerať presne takto. Treba ho prispôsobiť vaším potrebám, čo väčšinou znamená potrebu nazrieť do detailnej dokumentácie.

Zistenie stavu repozitára (status)

Zapamätanie stavu repozitára (commit)

Úmyselné rozvetvenie histórie (branch)

Úmyselné zvetvenie histórie (merge)

Založenie vzdialeného repozitára na bitbuckete

Prenos komitov z lokálneho repozitára na vzdialený (push)

Prenos komitov zo vzdialeného repozitára na lokálny (pull)