Gitolite est une solution permettant de gérer des dépôts Git distants. Il s'agit d'une ré-écriture de Gitosis réalisé par Sitaram Chamarty, un ancien contributeur de Gitosis, offrant plus de souplesse dans la gestion des permissions.

git-logo.png


Présentation

Gitolite permet d'authentifier les utilisateurs grâce à une clé SSH, et offre une gestion poussée des permissions par branche (là où Gitosis ne pouvait affiner les permissions que par dépôts) grâce à des ACLs.

L'un des aspects sympathiques de Gitolite est que la configuration se réalise au travers... d'un dépôt Git (tout comme Gitosis, la structure est d'ailleurs assez similaire).
Voici en gros le processus d'administration (l'étape 1 n'étant utile que lors de la création initiale du dépôt) :

  1. Création sur le serveur du dépôt de référence nommé gitolite-admin
  2. Récupération du dépôt gitolite-admin sur le client
  3. Modification des fichiers de configuration contenus dans le dépôt Git
  4. Enregistrer les modifications dans le dépôt Git local à coup de "git add" et de "git commit"
  5. Synchronisation du dépôt local avec le dépôt distant avec un "git push"

Le dépôt contient deux répertoires importants : conf et keydir.
% Le répertoire conf contient le fichier de configuration des autres dépôts et de leurs permissions, alors que keydir contient les clés SSH des utilisateurs.


Sur le client

Création d'un certificat SSH

Avant tout, il vous faut créer une clé SSH qui sera utilisez pour authentifier l'utilisateur git qui administrera le dépôt de gestion.

Copiez la clé publique.


Sur le serveur

Création de l'utilisateur git

Commençons par créer un utilisateur système (sans mot de passe) qui sera utilisé pour l'administration du dépôt de configuration et pour stocker les dépôts dans son répertoire utilisateur.

adduser --system --shell /bin/sh --gecos 'git version control' --group --disabled-password --home /home/git git
Ajout de l'utilisateur système « git » (UID ***) ...
Ajout du nouveau groupe « git » (GID ***) ...
Ajout du nouvel utilisateur « git » (UID ***) avec pour groupe d'appartenance « git » ...
Création du répertoire personnel « /home/git »...

Pour terminer avec l'utilisateur, copiez la clé SSH publique de votre utilisateur dans un fichier sur le serveur, idéalement dans le répertoire de l'utilisateur git :

su gitolite
nano /home/git/key.pub

Installation de Git et Gitolite

apt-get install git-core gitolite

Création du dépôt de gestion

La configuration et création du dépôt est à réaliser soit avec le commande :

dpkg-reconfigure gitolite

git-configure-1.png

git-configure-2.png

creating gitolite-admin...
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
creating testing...
Initialized empty Git repository in /home/git/repositories/testing.git/
[master (root-commit) 5e0caa5] start
 Committer: git version control <git@domain.tld>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

If the identity used for this commit is wrong, you can fix it with:

    git commit --amend --author='Your Name <you@example.com>'

 2 files changed, 6 insertions(+), 0 deletions(-)
 create mode 100644 conf/gitolite.conf
 create mode 100644 keydir/git.pub

Soit en utilisant la commande gl-setup à exécuter avec l'utilisateur git dans son répertoire home, avec comme paramètre le chemin vers la clé publique SSH, le résultat sera similaire à dpkg-reconfigure :

gl-setup /home/gitolite/gitolite.pub 
creating gitolite-admin...
Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
creating testing...
Initialized empty Git repository in /home/git/repositories/testing.git/
[master (root-commit) 4083826] start
 Committer: git version control <git@domain.tld>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

If the identity used for this commit is wrong, you can fix it with:

    git commit --amend --author='Your Name <you@example.com>'

 2 files changed, 6 insertions(+), 0 deletions(-)
 create mode 100644 conf/gitolite.conf
 create mode 100644 keydir/gitolite.pub

Ces commandes auront également pour effet de copier pour vous la clé SSH dans le fichier .ssh/authorized_keys, accompagnée des options indispensables, par exemple :

# gitolite start
command="/usr/share/gitolite/gl-auth-command gitolite",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-dss 
bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla-bla User
# gitolite end

Vous pouvez ensuite spécifier votre nom et votre adresse mail avec les deux commandes suivantes :

git config --global user.name "Votre Nom"
git config --global user.email votreemail@domain.tld

Enfin, donnons les permissions adéquates aux répertoires :

chmod g+r /home/git/projects.list
chmod -R g+rx /home/git/repositories

Retour sur le client

Maintenant que notre dépôt de gestion est en place, nous allons le copier sur notre poste de travail. Si le port TCP du serveur SSH n'est pas standard (différent de 22), consultez le billet Utiliser Git avec un port SSH non standard. Pensez également à vous assurer que la directive AllowUser de votre serveur SSH accepte bien les connexions de l'utilisateur git.

git clone git@git.domain.tld:gitolite-admin.git
Cloning into gitolite-admin...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.

Voilà le dépôt cloné sur le poste de travail. Modifiez le pour ajouter un nouveau dépôt :

cd gitolite-admin/
nano conf/gitolite.conf

Ajoutez le dépôt nommé mondepot, comme ci-dessous, dans le fichier gitolite.conf (on verra ce fichier en détail un peu plus bas) :

        repo    gitolite-admin
                RW+     =   git

        repo    testing
                RW+     =   @all

        repo    mondepot
                RW+     =   git

Ajoutez le fichier dans Git :

git add conf/gitolite.conf

Commitez le changement :

git commit -m "Add mondepot repo"
[master 700f5bb] Add mondepot repo
 1 files changed, 3 insertions(+), 0 deletions(-)

Et envoyez les modifications vers le dépôt de gestion du serveur :

git push
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 385 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Already on 'master'
remote: creating mondepot...
remote: Initialized empty Git repository in /home/git/repositories/mondepot.git/
To git@git.domain.tld:gitolite-admin.git
   4083826..700f5bb  master -> master

Voilà votre premier dépôt en place sur le serveur et prêt à recevoir vos push !

Le fichier gitolite.conf

C'est le fichier central de la gestion des dépôts. Il permet d'indiquer les dépôts existant et de spécifier les autorisations des utilisateurs sur chacun d'entre eux.

L'organisation la plus classique est la suivant :

        repo    gitolite-admin
                RW+     =   git

La ligne "repo gitolite-admin" indique la présence d'un dépôt (avec repo) et son nom (gitolite-admin).
La ligne "RW+ = git" spécifie les permissions, ici un accès complet (RW+) pour l'utilisateur nommé git.

Les groupes

Vous pouvez créer des groupes d'utilisateurs, de dépôts et de branches avec la syntaxe suivante :

@groupe_utilisateurs1 = utilisateur1 utilisateur5 utilisateur8
@groupe_utilisateurs2 = utilisateur3 utilisateur7
@gros_groupe = @mon_groupe_utilisateurs1 @mon_groupe_utilisateurs2
@groupe_de_depot = depot1 depot4
@belles_branches = master$ developpement$
Les permissions

Vous avez le choix entre :

  • R permet de cloner et de faire des pull sur le dépôt.
  • RW ajoute la possibilité des faire des push.
  • RW+ - ajoute les "rewind permissions".
  • - permet d'interdir l'écriture

Par exemple, les lignes suivantes permettent au groupe @groupe_utilisateurs1 de tout faire sur le dépôt beaudepot, sauf modifier la branche master :

repo beaudepot
    -    master$ = @groupe_utilisateurs1
    RW+          = @groupe_utilisateurs1

Les possibilités sont vastes. Consultez la documentation si vous avez besoin de permissions très affinées.

Quelques pages utiles et plus complète à lire (en anglais) sur sitaramc.github.com et www.calculate-linux.org.

Lister les dépôts et permissions

Vous pouvez obtenir la liste des dépôts et permissions via SSH ainsi :

ssh git@git.domain.tld
PTY allocation request failed on channel 0
hello git, the gitolite version here is 1.2.0 (Debian)
the gitolite config gives you the following access:
     R  W	depot1
     R  W	depot2
     R  	depot3
Connection to git.domain.tld closed.

Synchroniser les dépôts

Lors de la création d'un nouveau projet utilisatn Git sur votre machine locale, il faut classiquement commencer par créer le dépot dans le répertoire voulu :

git init
Initialized empty Git repository in /path/.git/

Ensuite on ajoute les nouveaux fichiers avant de vérifier que tout va bien :

git add .
git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#	new file:   .gitignore
#	new file:   404.php
#	new file:   BingSiteAuth.xml
#	new file:   contact.php
#	new file:   googlef7201a1b095e037c.html
#	new file:   index.php
#	new file:   mail.php
#	new file:   mentionslegales-textinside.php
#	new file:   mentionslegales.php
#	new file:   realisations.php
#	new file:   robots.txt
#	new file:   sitemap.xml
#	new file:   themes/_head.php
#	new file:   themes/footer.php
#	new file:   themes/header.php
#	new file:   themes/scripts/jquery.tools.min.js
#	new file:   themes/style.css
#	new file:   themes/stylebase.css
#	new file:   venirafourlette.php
#

On configure maintenant les paramètres du dépôt distant :

git remote add origin git@git.domain.tld:mondepot.git

Puis on commit la première modification (l'ajout des premier fichier du projet) :

git commit -m "Add Files"
[master (root-commit) 1fe96de] Add Files
 19 files changed, 2252 insertions(+), 0 deletions(-)
 create mode 100644 .gitignore
 create mode 100644 404.php
 create mode 100644 BingSiteAuth.xml
 create mode 100644 contact.php
 create mode 100644 googlef7201a1b095e037c.html
 create mode 100644 index.php
 create mode 100644 mail.php
 create mode 100644 mentionslegales-textinside.php
 create mode 100644 mentionslegales.php
 create mode 100644 realisations.php
 create mode 100644 robots.txt
 create mode 100644 sitemap.xml
 create mode 100644 themes/_head.php
 create mode 100644 themes/footer.php
 create mode 100644 themes/header.php
 create mode 100644 themes/scripts/jquery.tools.min.js
 create mode 100644 themes/style.css
 create mode 100644 themes/stylebase.css
 create mode 100644 venirafourlette.php

Et on balance sur la copie distante :

git push origin master:refs/heads/master
Counting objects: 23, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (22/22), done.
Writing objects: 100% (23/23), 28.82 KiB, done.
Total 23 (delta 2), reused 0 (delta 0)
To git@git.domain.tld:mondepot.git
 * [new branch]      master -> master

Et voilà le premier commit poussé sur le dépôt distant.


Déplacement du serveur

Si vous avez changer de serveur et perdu les dépots "Origin", voici les commandes à lancer sur la machine de travail pour envoyer les copies locales vers le nouveau serveur :

git remote rm origin
git remote add origin git@git.domain.tld:depot.git
git push origin master:refs/heads/master

On supprime d'abord l'ancien origin, on indique l'adresse du nouveau, puis on push l'ensemble de la copie locale.


GitList

Présentation et procédure d'installation sur le billet installation et configuration de GitList.


GitPHP

Installation

Très simple, il suffit de télécharger les sources et de décompresser l'archive dans un répertoire accessible par votre serveur web. Vous pouvez obtenir GitPHP sur le site du projet.

Modifier la configs

Une fois l'archive décompresser, il faut passer par une petite étape de configuration, qui consiste essentiellement à indiquer à GitPHP où se trouve le répertoire de vos dépôts Git. Pour cela, copier le fichier exemple de configuration, et éditez-le pour renseigner le répertoire des dépôts :

cp config/gitphp.conf.php.example config/gitphp.conf.php
nano config/gitphp.conf.php

La ligne à modifier est la suivante ;

/*
 * projectroot
 * Full directory on server where projects are located
 */
$gitphp_conf['projectroot'] = '/srv/git/repositories/';

Assurez vous que le répertoire de vos dépôts est bien accessible en écriture par votre serveur web. Si ça n'est pas le cas, aucun dépôts ne sera visible.

Si à chaque nouveau push sur votre dépôt GitPHP affiche "aucun commit" pour le dépôt concerné, il vous faut modifier le UMASK des fichiers créés suite à un psuh. Ça ce passe dans le fichier .gitolite.rc :

$REPO_UMASK = 0002;       # gets you 'rwxr-x---'
Créer un VHost dans NGinx
server {
	listen		80;
	server_name	git.domain.tld;
	root		/path/to/gitrepo;
 
	location / {
		index		index.php;
		try_files $uri $uri/ /index.php?q=$uri&$args;
		}
 
	location ~ .php$ {
		fastcgi_split_path_info ^(.+.php)(/.+)$;
		include        fastcgi.conf;
		fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME  /srv/http/gitphp/$fastcgi_script_name;
		fastcgi_cache_valid any 1m;
		fastcgi_intercept_errors on;
		}
	}

Sources : http://blog.hokietux.net/?p=247 http://sitaramc.github.com/gitolite/g2/progit.html

Cette article est un brouillon depuis 2012... Le voilà publié !