Úvod
Na úvod vás musím upozornit na poslední tři díly tohoto seriálu, které se věnovaly SCM nástroji Git, základům jeho používání a jeho nasazení na vlastní server, počínaje těmi nejjednoduššími způsoby (OpenSSH) až po víceuživatelské řešení s Gitosis v minulém díle. Projděte si první, druhý a třetí díl, abyste byli v obraze.
Gitolite představuje z řešení zde probíraných nejsofistikovanější nástroj pro víceuživatelský přístup k centralizovanému Git repozitáři. Oproti Gitosis umí omezit právo zápisu na konkrétní větve (branches), respektive reference (refs). Můžete kontrolovat i to, zda má uživatel právo provést „rewind“, tedy „odčinění“ commitů nebo jiné změny historie.
Je třeba si dát pozor na jednu věc. Gitolite neumí omezit read-only přístup na úroveň jednotlivých větví. Konkrétnímu uživateli tedy můžete zakázat read-only přístup k celému repozitáři, ale nikoliv ke konkrétním větvím. Je to dáno tím, že Git neumí rozlišit mezi jednotlivými větvemi, pokud provádí čtení. Tento problém spolu s alternativami řešení je podrobně popsán v dokumentaci.
Instalace
Instalace Gitolite v Debianu je jako už tradičně velmi jednoduchá, neboť stačí nainstalovat příslušný balíček z oficiálních repozitářů:
aptitude install gitolite
Pokud při instalaci nedojde k vytvoření správcovského repozitáře, což se alespoň v mém případě nestalo, je třeba jej inicializovat ručně. Naštěstí je k tomu připraven nástroj gl-setup. Ten musíte spustit s právy uživatele gitolite, pod kterým bude Gitolite pracovat. Tento nástroj vyžaduje jeden parametr, a tím je cesta k souboru s veřejným SSH klíčem, který bude využíván pro přístup ke správcovskému repozitáři.
Tady pozor – jelikož tento nástroj musí běžet s právy uživatele gitolite, je třeba, aby k umístění souboru s klíčem měl tento uživatel přístup, čehož lze docílit např. zkopírováním souboru s veřejným SSH klíčem do /tmp. Následně stačí provést:
su gitolite -c 'gl-setup /tmp/uzivatel.pub'
Uživatelé Gitosis mají uživatelská jména shodná se jménem souboru s veřejným SSH klíčem. Proto je vhodné při provádění příkazu výše jméno souboru přizpůsobit, abyste pak neskončili s uživatelem "id_rsa". Vše jde však samozřejmě později upravit.
Základní konfigurace
V tuto chvíli byste měli být schopní naklonovat konfigurační repozitář:
git clone gitolite@server
example
org:gitolite-admin
Repozitář by měl obsahovat dva adresáře: adresář conf s konfiguračním souborem (gitolite.conf) a adresář keydir obsahující soubory s SSH klíči. Přidání nového uživatele tedy vyžaduje přidání jeho SSH klíče do adresáře keydir v podobě souboru se jménem ve tvaru uzivatel.pub a následné přidání příslušných práv v conf/gitolite.conf.
Uživatelé a skupiny
Skupiny se od uživatelů liší v tom, že jsou uvozeny zavináčem. Výchozí skupinou je skupina @all, zahrnující všechny uživatele. Ostatní skupiny můžete snadno nadefinovat:
@vyvojari = michal ludek jana @spravci = root admin @personal = @vyvojari @spravci
Skupina se samozřejmě může skládat z více skupin (viz definice skupiny @personal) a uživatelé mohou patřit do různých skupin. V systému oprávnění je možné konkrétní právo přiřadit uživateli, skupině, nebo obojímu.
Systém oprávnění
Základní práva, která můžete přiřadit jednotlivým uživatelům a skupinám, mají následující podobu:
|
Oprávnění |
Význam |
|---|---|
|
|
read-only přístup |
|
|
právo provést |
|
|
totéž co |
|
|
odepřít přístup |
Příklad definice nového repozitáře tedy může vypadat takto:
repo projekt
RW+ = michal @spravci
RW = ludek jana
R = pepa
Podstatnou změnou oproti Gitosisu není však pouze zjemnění práv, ale také možnost příslušná práva aplikovat na konkrétní větve, resp. na konkrétní reference (refs). Názorněji to bude vypadat na příkladu:
repo projekt
RW master$ = michal @spravci
RW refs/heads/master$ = michal @spravci
Mezi oprávněním a rovnítkem může být regulární výraz, který definuje konkrétní referenci, k níž má dotyčný daný přístup. Neuvedete-li na začátku výrazu refs/, doplní si Gitolite interně na začátek refs/heads/ – oba zápisy oprávnění v příkladu výše jsou tedy ekvivalentní. Znalci regulárních výrazů určitě tuší, že dolar na konci značí konec řádku, tj. výše uvedený zápis povolí uživateli michal zápis do větve master, ale už ne do větve nazvané např. mastermind. Pokud by tam dolar na konci nebyl, měl by právo zápisu i k větvi mastermind. Pokud vám regulární výrazy nic neříkají, bylo by dobré se na ně podívat. Pod článkem naleznete několik odkazů, které by vám měly tuto problematiku osvětlit.
Pokud mezi oprávněním a rovnítkem nic neuvedete, bude se příslušné oprávnění vztahovat na celý repozitář se všemi větvemi.
Podobně lze zacházet i s tagy – je možné uživatelům povolit nebo nepovolit přiřazovat tagy jako takové nebo tagy v určitém tvaru.
repo projekt
RW refs/tags/rc[0-9] = michal
- refs/tags/rc[0-9] = ludek
RW refs/tags = ludek
Zde je uživateli michal uděleno právo vytvářet tagy ve tvaru rc[číslo], je tedy možné vytvořit tag rc1, rc10, ale také rc1a. Uživatel ludek má oprávnění vytvářet libovolně pojmenované tagy, ovšem s výjimkou tagů začínajících na rc[číslo]. Budete-li zacházet s oprávněním pro odepření přístupu (mínusem), mějte na paměti, že záleží na pořadí prováděných pravidel. Kdybyste příklad výše otočili a dali prostřední řádek na konec, uživatel ludek by mohl vytvářet jakékoliv tagy a přístup by mu nikdy odepřen nebyl.
Tolik k základům konfigurace Gitolite. Mnohé pokročilé vlastnosti Gitolite zde nezazněly, a (nejen) proto vám doporučuji podívat se na oficiální dokumentaci ke Gitolite, která je velmi podrobná a přívětivá, čtivě psaná a plná užitečných příkladů. Uživatelům Gitolite důrazně doporučuji si ji projít.
Workflow
Styl práce s Gitolite je velice podobný práci s Gitosis. Jakmile vytvoříte vhodnou půdu pro nový repozitář úpravou konfiguračních souborů, jejich commitem a nahráním (push) na server, stačí u místního repozitáře přidat vzdálený server:
git remote add origin gitolite@server
example
org:repositar.git
A následně provést push na server:
git push origin master:refs/heads/master
Tím by mělo dojít k vytvoření „master“ větve v repozitáři na serveru.
Na závěr zmíním ještě jeden tip – pokud se na server přihlásíte přes SSH, oznámí vám Gitolite, k čemu máte jaký přístup (Gitosis toto neumí):
ssh gitolite@server
example
org
hello admin, the gitolite version here is 1.5.4-2+squeeze1 (Debian)
the gitolite config gives you the following access:
R W gitolite-admin
R W projekt
@R @W testing
Tím bych tento díl ukončil.






