VCS/Git/CreateRemoteRepository
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
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
Création du répertoire de travail de git
mkdir -p /var/lib/git cp /etc/skel/.bash* /var/lib/git/ 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 un compte utilisateur, on exporte notre dépôt existant
cd /tmp $ git clone --bare file:///home/didier/vcs/scripts scripts.git
On autorise l'export de notre projet par le service git
$ touch /tmp/scripts.git/git-daemon-export-ok
Déplacement du dépôt précédemment exporté et on change l'utilisateur et le groupe
# mv /tmp/*.git /var/lib/git/ # chown -R git:git *.git
Mise en place d'un nouveau dépôt
# su - git $ mkdir newrepo $ cd newrepo $ git init --bare
Ajout d'un utilisateur local
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
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 l'ajouter au groupe repo1 :
# groupadd repo1 # useradd joe -s /usr/bin/git-shell -G repo1 # chgrp -R repo1 /var/lib/git/repo1
Selinux
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.
Mais la modification rapporte une erreur.
$ touch test $ git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # test nothing added to commit but untracked files present (use "git add" to track) $ 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 $ 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 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.