VCS/Git/CreateRemoteRepository

De TartareFR
Version datée du 24 janvier 2013 à 10:32 par Didier (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche
LogoGit.svg

Configurer Git-daemon

Installation

# yum install git-daemon

Initialisation du repository

Le paquet git-daemon offre une configuration initiale satisfaisante utilisant le service xinetd.

On vérifie la présence de la ligne suivante dans le fichier /etc/services :

$ grep 9418 /etc/services
git             9418/tcp                # git pack transfer service
git             9418/udp                # git pack transfer service

Par défaut, la configuration exporte les dépôts git présents dans les répertoires utilisateurs <path>~/vcs</path> (paramètre user-path) et <path>/var/lib/git</path> (paramètre base-path).

On supprimera le switch --export-all pour limiter l'export aux seuls dépôts possédant le fichier <path>git-daemon-export-ok</path>.

 $ cat /etc/xinetd.d/git
 # default: off
 # description: The git dæmon allows git repositories to be exported using \
 #	the git:// protocol.
 service git
 {
 	 disable	= no
         socket_type     = stream
         wait            = no
         user            = git
         server          = /usr/libexec/git-core/git-daemon
         server_args     = --base-path=/var/lib/git --user-path=~/vcs --syslog --inetd --verbose
         log_on_failure  += USERID
         # xinetd doesn't do this by default. bug #195265
         flags		= IPv6
 }

Bien évidemment, il faudra redémarrer le service xinetd pour que celui-ci prenne en compte les modifications apportées.

systemctl restart xinetd.service

Création du répertoire de travail de git

mkdir -p /var/lib/git
cp /etc/skel/.bash* /var/lib/git/

Ajout d'un utilisateur et un groupe dédié au service

useradd -r -d /var/lib/git -s /bin/bash -c 'Git user' git

et mise en place d'un mot de passe

passwd git
Idea.png
Génération de mot passe
Le projet KDE fournit un générateur de mot de passe: <app>kpassgen</app>.

Changement du l'utilisateur et du groupe propriétaires du répertoire de travail

chown -R git:git /var/lib/git

Initialisation de ssh

su - git
ssh-keygen -t rsa
touch .ssh/known_hosts .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
chmod 644 .ssh/known_hosts

Mise en place d'un dépôt existant

Avec le compte utilisateur git, on exporte notre dépôt existant directement dans le répertoire de travail.

su - git
$ git clone --bare file:///home/didier/vcs/scripts scripts.git

On autorise l'export de notre projet par le service git

$ touch scripts.git/git-daemon-export-ok

Mise en place d'un nouveau dépôt

# su - git
$ mkdir newrepo.git
$ cd newrepo.git
$ git init --bare

On autorise l'export de notre projet par le service git

$ touch newrepo.git/git-daemon-export-ok

Ajout d'un utilisateur local existant

Pour permettre le push, il faudra configurer un accès ssh pour chaque développeur. Attribuer le dépôt git à un groupe unix puis rattacher les développeurs à celui-ci est une bonne pratique.

cat /home/$USER/.ssh/id_rsa.pub >> /var/lib/git/.ssh/authorized_keys

Ajout d'un nouvel utilisateur local

Git offre un shell de connexion minimaliste git-shell ne permettant que les opérations push et pull.
Ici, on crée un compte pour l'utilisateur joe avec git-shell pour shell de connexion et on l'ajoute au groupe repo1 :

# groupadd repo1
# useradd joe -s /usr/bin/git-shell -G repo1
# chgrp -R repo1 /var/lib/git/repo1

Selinux

Les dépôts git doivent avoir le contexte git_sys_content_t

Le répertoire caché <path>/var/lib/git/.ssh</path> qui doit avoir le contexte ssh_home_t.

On fixe les permissions selinux comme ceci

semanage fcontext -a -t ssh_home_t '/var/lib/git/.ssh(/.*)?'
semanage fcontext -a -t git_system_t '/var/lib/git/.*\.git(/.*)?'
restorecon -Rv /var/lib/git

Tests

Accès lecture seule

Ici n'importe qui ayant accès au serveur peut cloner le dépôt.

$ git clone git://localhost/rpm
Cloning into 'rpm'...
remote: Counting objects: 96, done.
remote: Compressing objects: 100% (89/89), done.
remote: Total 96 (delta 6), reused 96 (delta 6)
Receiving objects: 100% (96/96), 56.60 MiB | 41.59 MiB/s, done.
Resolving deltas: 100% (6/6), done.

On modifie le dépôt local.

$ touch test
$ git add test
$ git commit -m 'Add test file'
[master 4fc0b91] Add test file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test

Mais la modification du dépôt distant rapporte une erreur.

$ git push
fatal: remote error: access denied or repository not exported: /rpm

Nous avons donc bien un dépôt public en lecture seule

Accès en lecture écriture

Il faut avoir préalablement importer la clé ssh publique de l'utilisateur comme expliqué ici.

On peut tout de suite testé si la clé est bien intégrée

$ ssh git@localhost
Last login: Wed Jan 23 18:30:23 2013 from localhost
$

On clone le dépôt sans problème

$ git clone git@localhost:rpm.git
Cloning into 'rpm'...
remote: Counting objects: 96, done.
remote: Compressing objects: 100% (89/89), done.
remote: Total 96 (delta 6), reused 96 (delta 6)
Receiving objects: 100% (96/96), 56.60 MiB | 21.12 MiB/s, done.
Resolving deltas: 100% (6/6), done.

On modifie le dépôt local

$ cd rpm
$ touch test
]$ git add test
$ git commit -m 'Add test file'
[master e6bab0d] Add test file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test

On synchronise le dépôt distant facilement

$ git push
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 269 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
To git@localhost:rpm.git
   af18a33..e6bab0d  master -> master

Nous avons bien accès en lecture/écriture sur le dépôt distant.

Note.png
Push sur un dépôt distant vide
A la première synchronisation sur un dépôt distant vide, il faut préciser le dépôt distant
git push origin master