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 du dépôt nu
Avec un compte user, on exporte notre dépôt
cd /tmp git clone --bare file:///home/didier/vcs/scripts scripts.git
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
On autorise l'export de notre projet par le service git
# touch /var/lib/git/scripts.git/git-daemon-export-ok
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
$ 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.
$ 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 $ 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