Tag Archives: git

Mise en commun d’un serveur git via ssh et mise à disposition à tous

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:

git-users:x:199:mycroft,patrick

Le dépôt sera physiquement dans /git. On le crée (et on n’oublie pas le –bare !):

# mkdir -p /git/newproject
# 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:

# cd /git
# 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:

# cd sygit.git
# git repo-config core.sharedRepository group

On n’a plus qu’à fixer les permissions manuellement:

# chgrp -R git-users /git/sygit.git
# 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

git stream tcp nowait nobody /usr/bin/git git daemon --inetd --verbose --export-all --base-path=/git /git

… et on redémarre le daemon:

/etc/init.d/openbsd-inetd restart

Testons !

Sur ma machine de travail, on clone le dépôt en read-only:

$ git clone git://mkz.me/sygit.git
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 rm origin
$ 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:

$ vim README
$ 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à !

Uploader et partager son projet git sur un serveur

J’ai créé mon projet versionné sous git, et maintenant, je veux le partager aux autres. Voici les étapes à suivre pour faire un clone du projet, l’uploader et le mettre à disposition.

On clone avec l’option ‘–bare’ le projet. Cela permet de créer un dépot composé uniquement de la base de données git. Ce dépot pourra ensuite être cloné par d’autres:

$ git clone --bare test-sf-git test-sf.git
Initialized empty Git repository in /home/mycroft/tmp/test-sf.git/
$

On upload, ici sur mon serveur ‘remote-server’ en ssh dans mon public_html. Il sera du coup disponible:

$ scp -r test-sf.git login@remote-server:www/
9de29bb2d1d6434b8b29ae775ad8c2e48c5391                            100%   15     0.0KB/s   00:00    
ade6c53443196f3146de569b58b36bfcb5a98f                            100%  196     0.2KB/s   00:00    
cb726ceadb9b58db9877d442399cc84de9a10b                            100%   51     0.1KB/s   00:00

Sur le serveur, il faudra mettre à jour les infos de ce dernier afin que le dépôt soit utilisable:
$ ssh login@remote-server
$ cd www/test-sf.git
$ git-update-server-info
$

De retour en local dans test-sf-git, on défini ce dépot cloné comme origin, cela nous servira pour pusher nos futurs modifs:

$ cd test-sf-git
$ git remote add origin login@remote-server:test-sf.git
$

On vérifie la manip’:

$ git remote show origin
* remote origin
  Fetch URL: login@remote-server:test-sf.git
[...]

Pour mettre à jour ce dépôt, après de futurs modifications, on pourra push:

$ git push origin
Everything up-to-date

(Là évidement j’avais pas de modification …)

De même, dans l’autre sens, on pull-era le dépôt:

$ git pull origin master
From remote-server:test-sf
 * branch            master     -> FETCH_HEAD
Already up-to-date.

Une personne tierce pourra à partir de ce moment clone notre dépôt:

$ cd ~/tmp
$ git clone http://remote-server/~login/test-sf.git
Initialized empty Git repository in /home/mycroft/dev/test-sf/.git/

$

Collaborer sur votre projet Symfony 1.4 avec git

J’expérimente actuellement de nouveaux outils de travail, et git est l’un d’entre eux. Le but à terme serait d’évaluer la solution et de la comparer à subversion.

Voici alors un petit tutoriel pour débuter un projet symfony (1.4) avec git:

Tout d’abord, je garde les sources de symfony hors du tree de mon projet, pour la bonne raison que j’utilise plusieurs versions de symfony à la fois (sur différents projets), et que j’ai préfèré les centraliser dans /usr/share/php au lieu de les dispatcher un à un et devoir les maintenir dans mon tree. De plus, symfony 1.4 n’est pas maintenu sous git par les développeurs officiels (Il existe bien un symfony-git.sf.net non officiel, mais il ne semble pas être mis à jour régulièrement). Finalement, la taille du projet est moindre car ne contient que nos fichiers.

$ alias symfony=/usr/share/pear/symfony/symfony14/data/bin/symfony
$ symfony -V
symfony version 1.4.6-DEV (/usr/share/pear/symfony/symfony14/lib)

Création du répertoire du projet

$ mkdir myproject
$ cd myproject

Initialisation du dépot:

$ git init

Création de notre projet symfony:

$ symfony generate:project azure
[...]
$ ls
apps  cache  config  data  lib  log  plugins  symfony  test  web

Premier commit:

$ git commit -m "Initial commit"
[master (root-commit) 20c9217] Initial commit
 11 files changed, 161 insertions(+), 0 deletions(-)
 create mode 100644 config/ProjectConfiguration.class.php
[...]

Dans les actions à mener également, on peut faire ignorer les modifications dans cache et dans log:

$ echo 'cache/*' >> .gitignore
$ echo 'log/*' >> .gitignore
$ cat .gitignore
log/*
cache/*

$ git add .gitignore && git commit -m 'Add an .gitignore with cache/* and log/*'
[master 5a9e245] Add an .gitignore with cache/* and log/*
[...]

Et voilà. A partir de ce moment on peut commencer sérieusement à travailler sur notre projet ! :)