1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282
|
***************************
Rychlá cesta pro netrpělivé
***************************
.. module:: tour
:synopsis: A Gentle Introduction to Using TortoiseHg on Windows
Jak už bylo řečeno, TortoiseHg je extenze rozhranní Průzkumníka Windows a řada dalších grafických aplikací, které slouží jako uživatelsky příznivé prostředí pro rozptýlený systém kontroly verzí (DVCS) Mercurialu. Všechny nástroje TortoiseHg jsou přístupné přes kontextové menu Průzkumníka nebo pomocí aplikace příkazového řádku, nazvané :command:`hgtk`. Příkazy Mercurialu jsou také dostupné ze standardní aplikace příkazového řádku :command:`hg`.
Konfigurace programu
======================
Nejprve se musíme do programu TortoiseHg řádně zapsat. Uděláme to tak,
že upravíme jeho globální (uživatelské) nastavení. Pravým klepnutím kdekoli na volné ploše obrazovky otevřeme kontextové menu a vybereme :menuselection:`TortoiseHg -> Globální nastavení`
.. figure:: figures/cmenu-global-settings.jpg
:alt: Desktop Context Menu
Přístup ke globálnímu nastavení z plochy monitoru
Otevře se okno pro Globální nastavení uživatele. Používáme-li příkazový řádek, otevřeme toto okno příkazem :command:`hgtk userconfig`.
.. figure:: figures/settings.png
:alt: Settings Dialog
Konfigurace uživatele
Nejprve vybereme záložku :guilabel:`Commit` a zadáme jméno do textového pole :guilabel:`Jméno uživatele`.
.. note::
Opomeneme-li zadat své jméno, zeptá se nás na něj program při
nejbližším použití příkazu *commit*; bude to poprvé, kdy je
jméno požadováno.
.. note::
Pro formátování uživatelského jména není pevné pravidlo ale obvykle se používá následující formát::
Celé Jméno <email>
například ::
Donald Duck <donaldduck@example.net>
Emailová adresa je odtržena při prohlížení historie změn a vestavěný webový server zakryje emailovou adresu
v rámci prevence proti spamu.
Dále vybereme záložku :guilabel:`TortoiseHg` a v ní :guilabel:`Nástroj pro sloučení`. V rozvinovacím seznamu nalezneme všechny slučovací nástroje nalezené v programovém vybavení počítače (kdiff3 je poskytnut instalátorem pro Windows) a řadu interních způsobů sloučení. Vybereme si oblíbený nástroj pro slučování.
Pokud chceme, aby TortoiseHg používal náš vybraný slučovací nástroj také pro vizuální zobrazení diffů, necháme položku :guilabel:`Nástroj Visual Diff` neurčenu. Jinak si v rozvinovacím seznamu vybereme z nabízených nástrojů.
Pokud nám v rozvinovacích seznamech není nabídnuta žádná volba, musíme nainstalovat slučovací nástroj, který je podporován v mergetools.rc nebo si nakonfigurovat nástroj vlastní.
.. note::
Při instalaci TortoiseHg ze zdroje, je nutné nějakým způsobem přidat soubor contrib/mergetools.ini do cesty HGRC. Možný způsob je připojit jej ze souboru ~/.hgrc.
Neostýchejme se v otevřeném okně konfigurovat i další položky globálního nastavení. Tato nastavení budeme moci později přepsat v konfiguraci repozitáře.
Nastavené změny potvrdíme a okno zavřeme tlačítkem :guilabel:`OK`.
.. note::
Většina nástrojů TortoiseHg vyžadují nové spuštění aplikace aby se projevily změny provedené v konfiguračním okně.
První seznámení
===============
Mercurial podporuje mnoho různých `modelů spolupráce <http://hgbook.red-bean.com/read/collaborating-with-other-people.html>`_. Tato kapitola popisuje pouze jeden z nich: model s centrálním repozitářem. Model s centrálním repozitářem je nejvíce známý těm, kteří přecházejí z jiných revizních systémů a je tedy nejvhodnější začít právě s ním.
Potřebujeme tedy vytvořit centrální repozitář. Bylo by možné přeměnit `nemercuriálový repozitář <http://mercurial.selenic.com/wiki/RepositoryConversion>`_ v repozitář Mercurialu ale v našem příkladu začneme úplně od začátku.
Založení nového repozitáře
==========================
Nový repozitář na svém počítači vytvoříme buď výběrem :guilabel:`Vytvořit repozitář` z kontextového menu, nebo příkazem :command:`hgtk init` z příkazového řádku. V kořenovém adresáři našeho projektu to stačí provést pouze jednou.
.. figure:: figures/init.png
:alt: Init dialog
Dialogové okno pro vytvoření repozitáře
Je dobré ponechat volbu :guilabel:`Přidat specifické soubory (.hgignore, ...)`
zatrženou a nezatrhávat :guilabel:`Učinit repo kompatibilní s Mercurial 1.0`
pokud k tomu nemáme pádný důvod.
Po stisku tlačítka :guilabel:`Vytvořit`, vytvoří Mercurial v našem projektovém adresáři složku :file:`.hg`. Zde si program ukládá všechny informace o jednotlivých verzích. Této složce se říká *repozitář*, zatímco adresář, který tuto složku obsahuje, je označován jako *pracovní adresář*.
Se složkou :file:`.hg` nikdy přímo nepracujeme. Při zadávání příkazů se případně odkazujeme na pracovní adresář.
Mezi pracovním adresářem a repozitářem existuje tajemná symbióza. Jak později poznáme, mění se obsah pracovního adresáře podle aktuálně nastavené revize.
Pojem pracovní adresář je tedy poněkud nejednoznačný. Je to jednak lokální adresář, do něhož jsme se přesunuli, jednak adresář, který souvisí s aktuálně nastavenou revizí.
Pokud to bude možné, bude v dalším textu první souvislost označována jako *adresář projektu* a *pracovní adresář* bude důsledně chápán jako odraz aktuální revize.
.. warning::
Editovat soubory ve složce :file:`.hg` je nebezpečné, může dojít
k poškození repozitáře. Jedinou výjimkou je konfigurační soubor :file:`.hg/hgrc`.
Přidávání souborů
=================
Mezi pracovním adresářem a repozitářem si představme přechodný prostor, do něhož se ukládají změny v pracovním adresáři před tím, než jsou předány k zápisu do repozitáře příkazem *commit*. Říkejme tomuto prostoru třeba *brašna*. Obdobný prostor v systému Git se nazývá *výstav*.
Nyní je třeba říci aplikaci Mercurial, které soubory v pracovním adresáři (předpokládejme, že tam nějaké máme) mají být sledovány a které ignorovány.
Lze to provést více způsoby - přidáme soubory do brašny dále uvedeným postupem ad 1 a 2:
1. V otevřeném adresáři otevřeme pravým klikem kontextovou nabídku
a vybereme :menuselection:`TortoiseHg -> Přidat soubory...` (případně z
příkazové řádky příkazem :command:`hgtk add`). Objeví se
dialogové okno, kde označíme soubory, které chceme do sledování přidat
a potvrdíme volbu tlačítkem :guilabel:`Přidat`.
2. Nebo tamtéž volbou :menuselection:`TortoiseHg -> Status souboru`
(případně příkazem :command:`hgtk status` z příkazového řádku)
otevřeme dialogové okno, kde vybereme přidávané
soubory a potvrdíme křížkem :guilabel:`Přidat`.
V tomto okně lze také aktivovat zařazení nepřidávaného souboru do filtru
tak, že pravým klikem ve zvýrazněném pruhu dosud nepřidaného souboru otevřeme další nabídku, kde
vybereme volbu :guilabel:`Ignorovat`, která
otevře dialogové okno *Ignorované soubory - ...*
3. Nebo naplníme brašnu přímo v nástroji :menuselection:`THg --> Commit...`.
4. Okno *Ignorované soubory - ...*, otevřeme také volbou :menuselection:`TortoiseHg ->
Ignorované soubory...`
případně příkazem :command:`hgtk hgignore`. Vybereme soubor ze seznamu nebo
vepíšeme do textového okna filtru *Glob* či *Regexp* (Regular expression) a potom
potvrdíme tlačítkem :guilabel:`Přidat`. Změny zadané v těchto filtrech
se projeví okamžitě.
.. note::
Soubor :file:`.hgignore` se vytvoří automaticky při první volbě ignorovaného souboru a je v běžných případech zahrnován do sledování repozitářem.
.. note::
Je dobrým zvykem nemít mnoho *neznámých* souborů ve svém pracovním adresáři.
Commit
======
Změny provedené v pracovních souborech předáme z brašny do svého repozitáře příkazem :guilabel:`commit` (předat či potvrdit). V otevřeném pracovním adresáři otevřeme nabídku :guilabel:`TortoiseHg --> Commit...` ,
nebo zadáme příkaz :command:`hgtk commit`.
Napíšeme průvodní komentář, vybereme soubory, které chceme předat a stiskneme
:guilabel:`Commit`. Pokud si před uzavřením okna *Commit* uvědomíme, že jsme commit vlastně nechtěli,
můžeme jej ještě zrušit tlačítkem :guilabel:`Zpět`.
.. figure:: figures/commit.png
:alt: Commit dialog
Okno akce Commit
Klonování repozitáře
====================
Nyní své výtvory již můžeme sdílet s ostatními. Zkopírujeme svůj repozitář
někam, kam mají přístup všichni členové naší skupiny. Tomuto úkonu se říká
*klonování repozitáře*. Provedeme jej nástrojem :menuselection:`TortoiseHg -> Klonovat...`, nebo příkazem
:command:`hgtk clone` z příkazového řádku. Potom zadáme cestu k místu určení.
.. figure:: figures/share.png
:alt: Clone dialog
Okno akce Clone
Vytváříme-li klonováním *centrální repozitář*, potom nemusíme kopírovat
celý obsah pracovního adresáře. Zatržením volby :menuselection:`Neaktualizovat nový pracovní adresář` zajistíme kopírování pouze složky :file:`.hg`, která obsahuje úplnou historii revizí projektu.
Dalším klonováním tohoto klonu lze získat opět kompletní pracovní adresář (!), pokud tentokrát ponecháme výše popsanou volbu nezatrženou.
Doplňující poznámky
===================
V dalším textu této kapitoly se jestě setkáme s příkazy :menuselection:`Aktualizovat`, :menuselection:`Pull` (stáhnout) a :menuselection:`Push` (vystrčit). Poslední dva příkazy nalezneme v okně :menuselection:`ToroiseHg -> Synchronizovat`, případně je lze
zadat příkazem :command:`hgtk pull` respektive :command:`hgtk push`. Změny si lze před :menuselection:`Pull` a :menuselection:`Push` prohlédnout příkazem :guilabel:`Příchozí` a :guilabel:`Odchozí`.
Příkaz :menuselection:`Pull` přetáhne změny z repozitáře do repozitáře,
ale aby se tyto změny promítly do našich pracovních souborů,
musíme provést akci :guilabel:`Aktualizovat`. Tento příkaz sám provede i sloučení
rozdílných verzí, pokud se změna nachází pouze v jedné z nich. Pokud byly
měněné obě verze, musíme provést jejich sloučení příkazem :command:`hg merge`. Provedený příkaz :menuselection:`pull` nás na to sám upozorní (run 'hg heads' to see heads, 'hg merge' to merge).
Příkazem :guilabel:`Push` vyšleme sloučené verze zpět do centrálního
repozitáře. Patří k dobrému vychování neukládat v centrálním repozitáři
rozdílné verze stejného souboru.
Práce s repozitáři
==================
Konkretní použití jednotlivých příkazů si názorně ukážeme na následujícím schematickém příkladu - viz obrázek. Příkazy budeme zadávat z příkazového řádku konzoly cmd.exe. Představme si situaci, že náš počítač používají dvě osoby, Petr a Pavel. Petr založí adresář "bim" a v něm vytvoří první repozitář příkazem :command:`hgtk init`::
c:\bim> hgtk init --> Otevře se okno "Vytvořit nový repozitář"
Destinace: c:\bim
x Přidat specifické soubory (.hgignore, ...)
Učinit repo ...
Vytvořit
V otevřené složce **bim** vytvoří Petr nový textový soubor "bob.txt" s textem "Nazdar". Svoji práci potom předá do repozitáře::
c:\bim> echo Nazdar > bob.txt
c:\bim> hgtk commit --> Otevře se okno "bim - commit"
Do textového pole Petr zapíše průvodní text první revize (neboli changesetu): "bim mess 0"
Commit
.. figure:: figures/repos.png
:alt: Coordination scheme
Koloběh příkazů mezi repozitáři
**V dalším textu si vysvětlíme jednotlivé aktivity 1 - 9:**
1. Petr vytvoří klonováním centrální repozitář :guilabel:`bam`. Tento repozitář nemusí
obsahovat pracovní soubory::
c:\bim> hgtk clone --> Otevře se okno "Klonovat repozitář"
Cesta ke zdroji: c:\bim
Cesta k destinaci: c:\bam # vytvoří i adresář
x Neaktualizovat novou pracovní složku
Klonovat
2. Máme pracovní adresář "bam" s repozitářem, který budeme považovat za
centrální. Obsahuje pouze složku :guilabel:`.hg`. Pavel si založí adresář
:guilabel:`bum` a do něho si pořídí kopii centrálního repozitáře včetně pracovních
souborů::
c:\bum> hgtk clone --> Otevře se okno "Klonovat repozitář"
Cesta ke zdroji: c:\bam
Cesta k destinaci: c:\bum
# "Neaktualizovat novou pracovní složku" se tentokrát nezatrhne
Klonovat
3. Máme tři pracovní adresáře, Petr i Pavel mají totožné pracovní soubory.
Petr do svého souboru připíše "bim bim", Pavel "bum bum". Své nyní již rozdílné
změny potvrdí do svých repozitářů::
c:\b~m> hgtk commit --> Otevře se okno "b~m - commit"
zapíše se průvodní text, např. "bim mess 1", respektive "bum mess 1"
Commit
4. Musíme si uvědomit, že ve skutečnosti nevíme, co se děje v centrálním
repozitáři. Může již obsahovat změny pracovních souborů. Dejme tomu Petr
tedy provede akci::
c:\bim> hgtk pull --> Otevře se okno "bim - synchronizovat"
Do textového pole pro *Repo:* zadáme adresu centrálního repozitáře (c:\bam)
Příkazem "Příchozí" si zobrazíme případné změny, které mohou být převzaty
z centrálního repozitáře
Příkazem "Pull" převezmeme případné změny do svého pracovního adresáře.
5. V našem schematu předpokládáme, že žádné změny nejsou, takže můžeme
bez dalšího "vystrčit" naše změny zpět do centrálního repozitáře::
c:\bim> hgtk push --> Otevře se totéž okno
Pomocí tlačítka "Repo:" zadáme adresu centrálního repozitáře
Můžeme se příkazem "Odchozí" podívat co může odejít
Příkazem "Push" změny pošleme
6. Pavel si aktuální stav repozitáře stáhne již popsaným způsobem
::
c:\bum> hgtk pull --> Otevře se okno "bum - synchronizovat"
Zkontroluje adresu centrálního repozitáře
Pull
7. Pavlova situace je teď odlišná od Petrovy. V jeho pracovním adresáři se nacházejí dvě různé verze téhož souboru. Již při provádění příkazu "pull" byl upozorněn, že má provést příkaz "merge"
::
c:\bum>hgtk merge --> Otevře se okno "KDiff3"
Postupným výběrem dvou písmen z A, B, C vytvoří sloučení a uloží.
8. Provedené změny musí předat repozitáři
::
c:\bum>hgtk commit --> Otevře se okno "bum - commit"
Zapíše průvodní text, například "Merge one"
Commit
9. Sloučenou verzi odešle Pavel zpět do centrálního repozitáře
::
c:\bum> hgtk push
Jednotlivé příkazy budou v dalších kapitolách probrány ještě jednou a podrobněji.
.. vim: noet ts=4
|