Je suis en train de développer sygit, une interface web light pour naviguer dans un dépôt git. J’ai alors décidé de mettre au clair mes dépots et de monter ma propre architecture d’hosting git, sous debian.
Emplacement des dépôts
Les dépôts vont être accessible via ssh (lecture+écriture) et via git-daemon (par dessus d’inetd, en lecture seule). On décide de créer un groupe « git-users » pour ceux qui auront accès aux dépots. On édite donc /etc/group:
Le dépôt sera physiquement dans /git. On le crée (et on n’oublie pas le –bare !):
# cd !-1:2
# git --bare init
Initialized empty Git repository in /git/newproject/
On pourra également réutiliser un projet déjà existant dont on créerait un dépôt bare:
# git clone --bare git://github.com/mycroft/sygit.git
Cloning into bare repository sygit.git...
remote: Counting objects: 48, done.
remote: Compressing objects: 100% (47/47), done.
remote: Total 48 (delta 21), reused 0 (delta 0)
Receiving objects: 100% (48/48), 8.77 KiB, done.
Resolving deltas: 100% (21/21), done.
Pour ces projets, il faudra changer la configuration et leur indiquer qu’il s’agit d’un dépôt partagé sur la base du groupe. Pour cela, il faut modifier la propriété core.sharedRepository:
# git repo-config core.sharedRepository group
On n’a plus qu’à fixer les permissions manuellement:
# find /git/sygit.git -type d -exec chmod g+ws {} \;
Mise en place de git-daemon
On utilise inetd pour partager les dépôts. On édite donc /etc/inetd.conf …
… et on redémarre le daemon:
Testons !
Sur ma machine de travail, on clone le dépôt en read-only:
Initialized empty Git repository in /tmp/testgit/sygit/.git/
remote: Counting objects: 48, done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 48 (delta 21), reused 48 (delta 21)
Receiving objects: 100% (48/48), 8.77 KiB, done.
Resolving deltas: 100% (21/21), done.
$ cd sygit
$ git remote -v
origin git://mkz.me/sygit.git (fetch)
origin git://mkz.me/sygit.git (push)
Pour le moment, le seul remote configuré est le serveur git. Celui là étant en read-only, il va faloir le modifier pour pouvoir push:
$ git remote add origin mycroft@mkz.me:/git/sygit.git
$ git remote -v
origin mycroft@mkz.me:/git/sygit.git (fetch)
origin mycroft@mkz.me:/git/sygit.git (push)
Il ne reste plus qu’à modifier un fichier, le commiter et le pusher:
$ git add README
$ git commit -m "Update README"
[master 2d98128] Update README
1 files changed, 6 insertions(+), 0 deletions(-)
$ git push origin master
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 375 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
To mycroft@mkz.me:/git/sygit.git
826d9b0..2d98128 master -> master
Et voilà !