Nastavení GIT repozitáře pro přístup přes HTTP

Pro školní projekt, který vypracováváme v týmu, se hodí mít systém pro správu verzí. Zvolili jsme program Git, jenž slibuje efektivní a přitom jednoduchou práci s repozitářem a je čím dál víc populárnější. Popíšu, jak jsem nastavoval Git na serveru, kde běží Debian.

Předpokladem k nastavení je nainstalovaný webový server Apache2 a program git-core. Dále je potřeba mít pravomoce na editaci konfiguračních souborů Apache, jeho restart příkazem (na Debianu)

$ /etc/init.d/apache2 restart

a práva měnit vlastníky souborů. Zkrátka a dobře je potřeba mít přístup k uživateli root, aby se dalo všechno správně a bezproblémů nastavit.

Krok první: vytvoření prázdného repozitáře Gitu

Nejprve je potřeba vytvořit složku, kde repozitář Gitu bude. Nejlepší je vytvořit ji v DocumentRootu složek webového serveru. Na Debianu DocumentRoot obvykle bývá ve /var/www, tedy vytvořím složku /var/www/mojerepo.git a v ní rovnou založím prázdný repozitář Gitu.

$ cd /var/www
$ mkdir mojerepo.git
$ cd mojerepo.git
$ git --bare init # nebo git --bare init-db

Novým souborům, které Git vytvořil, je nutné nastavit příslušná přístupová práva tak, aby k nim Apache mohl bezproblémů přistupovat. Debian má pro Apache vyhrazeného uživatele www-data, takže mu stačí přisoudit vlastnictví složky mojerepo.git, včetně všech podsložek a souborů.
$ chown -R www-data:www-data . 

Krok druhý: povolení DAV pro tuto složku

Co je to WebDAV? Jedná se o rozšíření HTTP protokolu pravidly, která dovolují více klientům přistupovat, vytvářet, mazat nebo jinak upravovat zdroje umístěné na serveru. Používá se například pro přístup k repozitářům programů pro správu verzí přes HTTP :)

S nainstalovaným Apache2 se zapnutí příslušných modulů webového serveru provede jedním příkazem

$ a2enmod dav dav_fs

Následnou konfiguraci zapíši do nového konfiguračního souboru git.conf ve složce /etc/apache2/conf.d, ale stejně tak se může zapsat přímo do souboru /etc/apache2/httpd.conf.
<Location /mojerepo.git>
     DAV On
     AuthType Basic
     AuthName "Git"
     AuthUserFile /etc/apache2/passwd.git
     Require valid-user
</Location>

V konfiguračním souboru se ale odkazujeme na soubor /etc/apache2/passwd.git a ten ještě neexistuje. K jeho vytvoření slouží utilita htpasswd. Vytvoření souboru s heslem je pomocí ní lehké, například příkazem
$ htpasswd -c /etc/apache2/passwd.git jmeno_uzivatele

Po jeho spuštění jsem vyzván k zadání hesla. Přepínač -c znamená, že se vytvoří nový soubor. Pokud chci uživatele jen přidat, přepínač vynechám.

Nyní stačí restartovat Apache

$ /etc/init.d/apache2 restart

a zkontrolovat umístění repozitáře na příslušné HTTP adrese a s příslušnými přihlašovacími údaji.

Krok třetí: nastavení klienta

Nejprve si klient musí vytvořit místní repozitář Gitu nebo si nějaký naklonovat. Klient zkrátka musí mít něco, s čím se dá pracovat, takže pokud to nemáte, opakujte první krok i na straně klienta.
Já místní repozitář už mám a můžu programu Git říct, kde je jeho vzdálený protějšek. Git na to má vlastní příkaz (pozor na / na konci)

$ git config remote.origin.url http://<uzivatel>:<heslo>@<adresa_serveru>/mojerepo.git/

Hned můžu udělat svůj první commit podobným příkazem
$ git push http : //<uzivatel>:<heslo>@<adresa_serveru>/mojerepo.git/ --all

Při dalších commitech už za push nemusím nic dávat, takže jednoduše git push.

Zde ale pozor. Možná Vám to půjde, možná ne a záleží to na verzi Git, kterou používáte. Git verze 1.5.6 a 1.6.0 neumí zapisovat (push) na http repozitáře serveru. Verze 1.6.1 a vyšší jsou v pořádku. Chybová hláška, kterou dostanete je

Unable to create branch path <http_adresa>/repo.git/info
Error: cannot lock existing info/refs
error: failed to push some refs to '<http_adresa>/repo.git'

Stejný problém jsem řešil i já a pomohlo mi vytvoření souboru .netrc ve svém domovském adresáři. Struktura souboru je jednoduchá
machine <adresa_serveru>
login <jmeno_uzivatele>
password <heslo_uzivatele>

Protože zde ukládám svoje heslo, nastavím souboru práva jen pro vlastní přístup příkazem
$ chmod 600 ~/.netrc

A je to. Commit provádím úplně stejně příkazem
$ git push origin

Snad Vám postup pomůže k bezproblémovému nastavení programu Git na serveru a zpřístupnění jeho repozitářů přes HTTP rozhraní. Mohou se vyskytnout ještě další problémy, ale s těmi pomůže Google :)