Mise en place d’un serveur git

Nous allons traiter l’installation et l’utilisation basique du gestionnaire de versions git.

Pour commencer, nous réaliserons les manipulations à faire côté serveur pour installer et configurer notre premier dépôt. Nous verrons par la suite, comment récupérer ce dépôt sur notre ordinateur. Et enfin, nous terminerons par la présentation des manipulations de base en réalisant avec un parallèle à Subversion un autre gestionnaire de versions.

Installation du serveur git

Installation et configuration

L’installation du paquet se fait tout simplement avec la commande suivante.

apt install git

Nous allons maintenant créer un utilisateur dédié à la gestion des dépôts. Pour le mot de passe de cet utilisateur, deux choix s’offrent à vous. Soit vous renseignez un mot de passe long très compliqué auquel cas il faudra copier la clé SSH de votre ordinateur, soit choisissez quelque chose de plus “simple” et vous devrez renseigner ce mot de passe manuellement à chaque échange avec le serveur.

adduser git

Maintenant que l’utilisateur est créé, nous allons faire un peu de sécurité en limitant ses commandes aux simples commandes pour la gestion d’un dépôt git. Commencez, par déterminer le chemin du binaire git-shell.

which git-shell

Éditez ensuite le fichier /etc/password pour modifier le binaire utilisé par l’utilisateur git.
La ligne devrait ressembler à quelque chose comme ceci :

git:x:1004:1005:,,,:/home/git:/usr/bin/git-shell

Copier votre clé SSH

Comme expliqué précédemment, vous pouvez passer cette étape si vous souhaitez entre le mot de passe manuellement. Dans le cas contraire, voici la procédure pour copier votre clé SSH sans utiliser la commande ssh-copy-id.

En effet, dans l’étape précédente, nous avons limité les commandes de l’utilisateur git. Par conséquent, nous ne pouvons plus copier notre clé SSH autrement qu’en éditant le fichier à l’aide d’un autre utilisateur.

Si le dossier /home/git/.ssh n’existe pas déjà, commencez par le créer et lui attribuer les bons droits :

mkdir /home/git/.ssh/
chown -R git: /home/git/.ssh/
chmod 700 /home/git/.ssh/

Ajoutez votre clé, en éditant le fichier authorized_keys et en copiant votre clé publique.

nano /home/git/.ssh/authorized_keys
Attention à ne mettre qu’une clé SSH par ligne !

Pour mémoire votre clé SSH publique est stockée dans le fichier “*.pub” du dossier .ssh de votre compte utilisateur. Vous pouvez utiliser la commande ci-dessous pour l’afficher et copier-coller votre mot de passe.

cat /home/foxinou/.ssh/id_rsa.pub

Création d’un dépot

Nous allons créer un script qui va automatiser la création d’un dépôt sur le serveur en exécutant les quelques commandes de base.

nano /home/git/create.sh

Copiez le contenu ci-dessous puis enregistrez-le.

#!/bin/sh
cd /data/git/
if [ "$#" -ne 1 ]; then
	echo "Usage: $0 DIRECTORY" >&2
	exit 1
fi
if [ -d "/data/git/$1.git" ]; then
	echo "$1: Already exists" >&2
	exit 1
fi
mkdir "$1.git"
if [ "$?" -ne 0 ]; then
	echo "Can't create directory" >&2
	exit 1
fi
cd "$1.git"
git --bare init
chown -R git: "/data/git/$1.git/"

Ajoutez le droit d’exécution du script shell.

chmod +x /home/git/create.sh

Pour créer un nouveau dépôt git, vous devez utiliser la commande ci-dessous en lui passant comme paramètre le nom du dépôt (sans l’extension “.git”).

sh /home/git/create.sh mondepot

Le script se chargera de créer un dossier /home/git/mondepot.git et d’initialiser tout le nécessaire.

Faire un clone du dépôt git sur votre ordinateur

Maintenant que tout est bien configuré, nous allons voir comment récupérer le dépôt sur votre ordinateur grâce à la commande ci-dessous.

En pré-requis, vous devrez avoir installé sur votre ordinateur la commande git comme sur le serveur à l’aide du gestionnaire d’installation des paquets.
git clone git@xx.xx.xx.xx:/home/git/mondepot.git

Pensez bien entendu à remplacer xx.xx.xx.xx par l’adresse ip ou le nom de domaine de votre serveur.

Connecter deux dépôts créés indépendamment

Cette étape est facultative et ne concerne qu’un cas particulier par exemple lorsque vous utilisez le framework Lumen ou Laravel.

Admettons que vous avez créé un dépôt git vide sur votre serveur, et que vous souhaitez envoyer les données d’un dépôt présent sur votre ordinateur. C’est le cas par exemple lorsque vous utilisez composer pour créer un projet Lumen.

La commande ci-dessous va permettre d’ajouter une source externe à votre dépôt local de façon à “push” les données vers le dépôt distant.

git remote add origin git@xx.xx.xx.xx:/home/git/mondepot.git

Cas d’un port SSH différent du numéro 22

Si vous avez changé le numéro de port SSH de votre serveur, vous allez pouvoir utiliser les commandes ci-dessous en les modifiants un peu.

Dans le cas du clone, il faut définir le protocole et le port comme ceci :

git clone ssh://git@xx.xx.xx.xx:22222/home/git/mondepot.git

Dans le cas de l’ajout d’une source distante, il faut faire la même chose que ci-dessus :

git remote add origin ssh://git@xx.xx.xx.xx:22222/home/git/mondepot.git

Manipulations de base de git

Pour cette section, nous allons faire un parallèle avec Subversion un autre gestionnaire de version. Si je fais ce parallèle, c’est aider ceux qui comme moi étaient habitué à SVN et qui sont confrontés au changement de philosophie qu’impose git.

Commencez par entrer dans votre dossier de projet.

cd mondepot

Mettre à jour son dépôt

Pour commencer, nous allons mettre à jour en récupérant les modifications sur le serveur. Pour SVN, il s’agissait de faire un “update” or ici la commande est “pull”.

git pull

Envoyer ses modifications

Maintenant créons un dossier puis un fichier que nous allons envoyer au dépôt serveur.

mkdir docs
touch docs/todo

Sous SVN, pour envoyer un fichier vous deviez simplement faire un “add” du fichier pour que le gestionnaire surveille ses modifications. Lorsqu’il était modifié, vous deviez faire un “commit” pour l’envoyer au serveur.

Avec git, la philosophie est légèrement différente car avant chaque “commit”, vous allez devoir utiliser la commande “add”. L’objectif de ce fonctionnement est de permettre le réduire un “commit” à seulement quelques lignes ou fichiers. Ainsi le commentaire que vous renseignerez sera en rapport avec ces fichiers et vous arriverez plus facilement à parcourir l’historique des modifications d’un projet.

Pour connaître les fichiers qui seront inclus dans ce “commit”, vous pouvez utiliser la commande suivante :

git status

Cette commande vous indiquera que notre fichier todo sera “ignoré du ‘commit'”. Nous allons donc l’ajouter avec la commande ci-dessous :

git add docs/todo

Lorsque vous avez trop de fichier et que vous ne souhaitez pas trop respecter ce principe de “un commit par fichier”, vous avez la possibilité de faire la commande comme ci-dessous qui va ajouter toutes les modifications de tous les fichiers.

git add .

Maintenant, en regardant avec la commande git status, vous verrez que votre fichier sera prit dans le “commit”.

git commit

La commande ci-dessus va vous ouvrir un éditeur pour taper un commentaire sur l’envoi. Une fois validé vous verrez que l’enregistrement est fait.

Attention : contrairement à Subversion, à ce stade, vous n’avez toujours pas transmit vos modifications au serveur !

En effet, pour envoyer votre version au serveur, vous allez devoir utiliser la commande ci-dessous qui initialisera une connexion SSH avec le serveur distant.

git push

Annuler toutes les modifications

Pour annuler toutes les modifications que vous avez faites sur votre ordinateur et revenir à l’état initial du dépôt, voici la commande à entrer.

git reset --hard

A ce stade, votre dossier n’est pas encore totalement identique au dépôt. En effet, après avoir réinitialisé les fichiers comme ils sont sur le dépôt distant, il faut penser à supprimer tous les fichiers qui ne sont pas pris en charge par git grâce à la commande suivante :

git clean -fd

De cette façon, vous vous retrouver avec un projet dans le même état qu’après avoir tapé la commande “clone”.

Ignorer les fichiers .DS_Store

Si vous êtes sous macOS, vous risquez de voir apparaître des fichiers .DS_Store dans vos envois…  Pour éviter ce problème, placez-vous à la racine du dépôt et créez un fichier .gitignore.

nano .gitignore

Maintenant, ajoutez le contenu ci-dessous pour ajouter une liste de différents fichiers qui n’ont pas à être pris en charge par git dans tous les dossiers du projet.

# OS generated files #
######################
*/.DS_Store
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db

Si des .DS_Store ont déjà été envoyé dans git, vous allez devoir les supprimer pour les retirer du dépôt distant également.

Voici une commande pour parcourir les dossiers du projet et supprimez ces fichiers.

find . -name '*.DS_Store' -type f -delete

Conclusion

A travers cet article, nous avons développé l’installation et l’utilisation basique de git à l’aide d’un parallèle à Subversion. Toutefois, cet article ne traite pas de tous les cas d’utilisation possible et nous aurons l’occasion de voir l’utilisation avancé de git prochainement.

Laisser un commentaire