sabato 4 luglio 2009

Git e Gitosis

Ecco come creare un repository git e condividerlo con gitosis su ubuntu 9.04.

Installare git


sudo apt-get install git-core python-setuptools

Installare gitosis

cd /tmp
git clone git://eagain.net/gitosis.git

cd gitosis
python setup.py install

Gitosis è un modo "semplificato" - si fa per dire - per gestire gli accessi al repository git e consiste nel modificare un file di configurazione con una serie di autorizzazioni e di chiavi pubbliche ssh associata ad ogni utente.

Prima di poter utilizzare gitosis va creato un utente ad hoc e configurato come amministratore di gitosis. L'utente che andiamo a creare molto originariamente si chiamerà git.


sudo adduser \ --system \ --shell /bin/sh \ --gecos 'git version control' \ --group \ --disabled-password \ --home /home/git \ git
l'utente appena creato avrà come unico compito di "ospitare" il repository e di far girare gitosis. Quindi i repository saranno almeno due
  • il repository in cui vogliamo mettere i nostri dati da versionare (può essere più di uno)
  • il repository amministrativo di gitosis che si chiama gitosis-admin
a questo punto bisogna fornire l'accesso al repository amministrativo ad un utente del sistema utilizzato per sviluppare (chiamiamolo valerio)
occorre quindi recuperare la chiave pubblica dell'utente valerio da ~/.ssh/id_rsa.pub ma se non è presente va creata con



ssh-keygen -t rsa

e importata nel repository amministrativo gitosis-admin con

sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub

il quale confermerà con un


Initialized empty Git repository in ./ Initialized empty Git repository in ./
si lo dirà 2 volte.

Bisogna aggiornare alcuni permessi poichè gitosis li imposta in maniera non corretta

sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

A questo punto il repository amministrativo è pronto e lo si può accedere ovviamente utilizzando git con

git clone git@localhost:gitosis-admin.git


verrà creata una sandbox con il file e la directory


-rw-r--r-- 1 valerio valerio 142 2009-07-04 17:31 gitosis.conf
drwxr-xr-x 2 valerio valerio 80 2009-07-04 17:31 keydir


gitosis.conf contiene la configurazione degli utenti mentre keydir contiene le chiavi pubbliche di tutti gli utenti (compresa già quella di valerio che è stata passata precedentemente con il comando sudo -H -u git gitosis-init < ~/.ssh/id_rsa.pub )

gitosis.conf contiene le seguenti voci

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = valerio@ken

il che significa che attualmente il repository gitosis-admin è accedibile da valerio dalla macchina ken utilizzando la chiave pubblica valerio@ken che è in

ls -l keydir/
-rw-r--r-- 1 valerio valerio 393 2009-07-04 17:31 valerio@ken.pub


A questo punto l'installazione è conclusa anche se ovviamente dovrebbero essere aggiunti i repository su cui si vuole versionare il proprio codice. Supponendo di voler creare un repository chiamato personale gitosis.conf assumerà l'aspetto

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members = valerio@ken

[group team]
writable = personale
members = valerio@ken

dopodichè va fatto il commit ed il push di queste modifiche

git commit -m "new personal repository" -a
git push


a questo punto l'utente valerio@ken è in grado di creare il repository personale con

cd /tmp
mkdir personale
cd personale/
git init
git remote add origin git@localhost:personale.git
echo "il mattino ha l'oro in bocca" > readme.txt
git add readme.txt
git commit -m "primo file"
git push origin master


e il repository personale adesso è accessibile con

git clone git@localhost:personale.git
Utenti multipli

Ovviamente è possibile utilizzare utenti multipli per un singolo repository aggiungendo vari utenti alla configurazione
[group team]
writable = personale
members = vcrini@vcrini-laptop valerio@ken

qui il repository mysite è scrivibile da vcrini e valerio. In keydir va copiata a mano la chiave pubblica vcrini@vcrini-laptop.pub

Volete debuggare?


Aggiungere "loglevel = DEBUG" proprio sotto la voce [gitosis] e fate attenzione agli spazi altrimenti non funziona.

[gitosis]
loglevel = DEBUG

[group gitosis-admin]
writable = gitosis-admin
...

Maggiori informazioni?
C'è un ottimo tutorial su Git qui.