Initialiser un dépôt vide sur le serveur

La première étape consiste à créer un dépôt vide sur le serveur centralisé. Sur monserveur.local, en tant qu’utilisateur matthieu, j’initialise un dépôt avec l’option --bare. Cette option signifie qu’il n’y aura que la base de données de git et non les fichiers de travail. On l’utilise principalement sur les serveurs car personne n’édite directement les fichiers ici.

git init --bare /home/matthieu/monprojet.git

Je ne traite que la méthode de connexion via SSH. J’installe ma clé publique SSH et je mets en place keychain pour plus de facilité lors des push / pull.

À partir de là, il y a deux solutions. Soit on clone le dépôt, soit notre dépôt local est déjà existant et on va le lier au dépôt sur le serveur afin de pouvoir pousser son contenu.

Première solution : cloner le dépôt

# clone du dépôt distant
git clone matthieu@monserveur.local:/home/matthieu/monprojet.git

cd monprojet/
# on peut travailler sur notre projet

Seconde solution : lier le dépôt

Les sources du projet sont situées sur une autre machine dans un dossier nommé projet, on va initialiser le dépôt local et le lier à celui qu’on a créé sur le serveur.

cd projet/
# initialisation du dépôt local dans le dossier courant
git init

# ajout des sources
git add .

# premier commit
git commit -m "premier commit"

# mise en place du lien vers le dépôt distant
git remote add origin matthieu@monserveur.local:/home/matthieu/monprojet.git

# push vers le dépôt distant
git push --set-upstream origin master

On peut aussi simplement pousser un dépôt local déjà existant vers ce serveur. On reprend juste les commandes git remote et git push.

Empêcher la login en SSH

Sur le serveur, on peut empêcher un utilisateur de se logguer, pour des raisons de sécurité. En effet, on n’a pas forcément envie que tout le monde puisse aller fouiner sur le serveur. Pour ce faire, c’est très simple, il suffit de définir son shell sur git-shell. Il faut d’abord l’ajouter dans la liste des shells existants.

# à ne faire qu'une seule fois
sudo bash -c "echo $(which git-shell) >> /etc/shells"

Ensuite, on indique que l’utilisateur doit utiliser ce shell.

# à faire pour chaque utilisateur à restreindre
sudo chsh --shell $(which git-shell) matthieu

À partir de cet instant, l’utilisateur matthieu ne peut plus se connecter en SSH sur le serveur, mais il peut quand même faire des fetch / push / pull / clone.

Utiliser un dépôt à plusieurs

La stratégie constiste à rendre le dépôt utilisable par un groupe d’utilisateurs. Dans le cas où l’on souhaiterait gérer plus finement les droits, pour différents dépôts, il faudra alors créer d’autres groupes, mais le principe reste le même.

# création du groupe gitusers
groupadd gitusers

On ajoute ensuite les différents utilisateurs devant accéder au dépôt dans le groupe gitusers.

usermod -a -G gitusers matthieu
usermod -a -G gitusers paul
usermod -a -G gitusers jacques

On crée ensuite le dépôt dans un endroit accessible, par exemple, /git.

# création du répertoire /git
sudo mkdir /git
# son propriétaire a tous les droits, le groupe a juste le droit d'y entrer
sudo chmod 710 /git

# on ajoute le setgid sur le répertoire. ainsi, tous les sous répertoires
# seront aussi du groupe gitusers
sudo chmod g+ws /git

# root est le propriétaire, gitusers le groupe
sudo chown root:gitusers /git

# on initialise un dépôt --bare en précisant qu'on le partage via le groupe
sudo git init --bare --shared=group /git/monprojet.git

Les utilisateurs peuvent ensuite faire un clone classique puis travailler ensemble.