VCS/Git/CreateRemoteRepository

De TartareFR
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

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.