« VCS/Git/CreateRemoteRepository » : différence entre les versions

De TartareFR
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
Ligne 55 : Ligne 55 :
  chmod 644 .ssh/known_hosts
  chmod 644 .ssh/known_hosts


=== Mise en place du dépôt nu ===
=== Mise en place d'un dépôt existant ===
 
Avec un compte utilisateur, on exporte notre dépôt existant
Avec un compte user, on exporte notre dépôt
  cd /tmp
  cd /tmp
  git clone --bare file:///home/didier/vcs/scripts scripts.git
  $ 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
Déplacement du dépôt précédemment exporté et on change l'utilisateur et le groupe
  mv /tmp/*.git /var/lib/git/
  # mv /tmp/*.git /var/lib/git/
  chown -R git:git *.git
  # chown -R git:git *.git


On autorise l'export de notre projet par le service git
=== Mise en place d'un nouveau dépôt ===
  # touch /var/lib/git/scripts.git/git-daemon-export-ok
  # su - git
$ mkdir newrepo
$ cd newrepo
$ git init --bare


=== Ajout d'un utilisateur local ===
=== Ajout d'un utilisateur local ===

Version du 23 janvier 2013 à 18:53

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

$ 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