Un serveur Git est un bare repository accessible en réseau. Pas
besoin d'une plateforme complète comme GitHub pour collaborer : un
simple serveur SSH suffit. Ce guide montre comment héberger vos dépôts
avec SSH, git-shell, Smart HTTP et git daemon.
Prérequis : Protocoles Git et Remotes fondamentaux.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Créer un bare repository pour servir un dépôt centralisé
- Configurer l'accès SSH pour un partage sécurisé en équipe
- Mettre en place Smart HTTP avec Nginx pour accès HTTPS
- Comprendre les limites d'un serveur Git auto-hébergé vs plateforme dédiée
Le bare repository
Section intitulée « Le bare repository »Un dépôt « bare » contient uniquement les données Git (l'équivalent du
dossier .git), sans copie de travail. C'est ce qu'on place sur un
serveur :
# Créer un bare repogit init --bare project.gitLe dossier project.git contient directement les répertoires objects/,
refs/, HEAD, etc., pas de fichiers de travail.
Pour créer un bare repo depuis un dépôt existant :
git clone --bare /chemin/vers/project project.gitMéthode 1 : accès SSH
Section intitulée « Méthode 1 : accès SSH »La méthode la plus simple et la plus sûre. Tout serveur avec SSH installé peut héberger des dépôts Git.
-
Sur le serveur, créez un utilisateur et un bare repo :
Fenêtre de terminal sudo adduser gitsudo mkdir -p /srv/git/project.gitsudo git init --bare /srv/git/project.gitsudo chown -R git:git /srv/git/project.git -
Ajoutez les clés SSH des développeurs :
Fenêtre de terminal sudo mkdir -p /home/git/.ssh# Ajoutez chaque clé publiquecat id_ed25519_dev1.pub >> /home/git/.ssh/authorized_keyscat id_ed25519_dev2.pub >> /home/git/.ssh/authorized_keyssudo chown -R git:git /home/git/.sshsudo chmod 700 /home/git/.sshsudo chmod 600 /home/git/.ssh/authorized_keys -
Depuis un poste client, clonez et poussez :
Fenêtre de terminal git clone git@serveur:/srv/git/project.gitcd project# ... travailler ...git push origin main
Sécuriser avec git-shell
Section intitulée « Sécuriser avec git-shell »Par défaut, l'utilisateur git a un accès SSH complet au serveur.
Pour le restreindre aux seules opérations Git :
# Vérifier que git-shell est dans /etc/shellssudo sh -c 'which git-shell >> /etc/shells'
# Changer le shell de l'utilisateur gitsudo chsh -s $(which git-shell) gitDésormais, si quelqu'un tente de se connecter en SSH interactif avec
l'utilisateur git, il reçoit :
fatal: Interactive git shell is not enabled.Seules les commandes git push, git pull et git fetch fonctionnent.
Méthode 2 : Smart HTTP (Nginx)
Section intitulée « Méthode 2 : Smart HTTP (Nginx) »Smart HTTP permet l'accès Git via HTTPS, idéal derrière un pare-feu ou pour les environnements CI/CD.
-
Installez les paquets :
Fenêtre de terminal sudo apt install nginx git fcgiwrap -
Configurez Nginx :
server {listen 443 ssl;server_name git.example.com;ssl_certificate /etc/ssl/certs/git.crt;ssl_certificate_key /etc/ssl/private/git.key;location ~ ^/git(/.*) {fastcgi_pass unix:/var/run/fcgiwrap.socket;include fastcgi_params;fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;fastcgi_param GIT_HTTP_EXPORT_ALL "";fastcgi_param GIT_PROJECT_ROOT /srv/git;fastcgi_param PATH_INFO $1;}} -
Activez le push sur les bare repos :
Fenêtre de terminal cd /srv/git/project.gitgit config http.receivepack true -
Clonez via HTTPS :
Fenêtre de terminal git clone https://git.example.com/git/project.git
Méthode 3 : git daemon (lecture seule)
Section intitulée « Méthode 3 : git daemon (lecture seule) »git daemon sert les dépôts via le protocole Git (git://). Il est
rapide mais sans authentification ni chiffrement :
git daemon --reuseaddr --base-path=/srv/git/ /srv/git/Pour autoriser un dépôt à être servi :
touch /srv/git/project.git/git-daemon-export-okComparatif des méthodes
Section intitulée « Comparatif des méthodes »| Critère | SSH | Smart HTTP | git daemon |
|---|---|---|---|
| Sécurité | Chiffrement + clés | TLS + auth HTTP | Aucune |
| Lecture | Oui | Oui | Oui |
| Écriture | Oui | Oui (si configuré) | Non |
| Configuration | Faible | Moyenne | Faible |
| Pare-feu | Port 22 | Port 443 | Port 9418 |
| Cas d'usage | Équipe interne | CI/CD, accès web | Miroir lecture seule |
Organiser les dépôts sur le serveur
Section intitulée « Organiser les dépôts sur le serveur »/srv/git/├── team-a/│ ├── api-backend.git│ └── frontend-app.git├── team-b/│ └── data-pipeline.git└── shared/ ├── common-lib.git └── config-templates.gitBonnes pratiques :
- Groupez par équipe ou par projet
- Utilisez des bare repos uniquement (pas de copie de travail)
- Gérez les permissions via les groupes Unix :
sudo chgrp -R team-a /srv/git/team-a/sudo chmod -R g+rwX /srv/git/team-a/Sauvegarder et restaurer un bare repository
Section intitulée « Sauvegarder et restaurer un bare repository »Un bare repository ne contient que l'historique Git : une sauvegarde simple et régulière suffit pour garantir la continuité.
Sauvegarder
Section intitulée « Sauvegarder »# Méthode 1 : archive tar (la plus simple)tar czf project-$(date +%Y%m%d).git.tar.gz /srv/git/project.git
# Méthode 2 : rsync vers un autre serveurrsync -az /srv/git/project.git backup-server:/backup/git/
# Méthode 3 : bundle Git (auto-contenu, transportable)git -C /srv/git/project.git bundle create project-$(date +%Y%m%d).bundle --allLe bundle Git est particulièrement utile pour les transferts hors-ligne ou les sauvegardes embarquées : il contient l'intégralité de l'historique dans un seul fichier portable.
Restaurer depuis une archive tar
Section intitulée « Restaurer depuis une archive tar »# Extraire le bare repotar xzf project-20260328.git.tar.gz -C /srv/git/
# Vérifier l'intégritégit -C /srv/git/project.git fsckRestaurer depuis un bundle
Section intitulée « Restaurer depuis un bundle »# Vérifier le bundlegit bundle verify project-20260328.bundle
# Cloner depuis le bundle (reconstruction complète)git clone project-20260328.bundle /srv/git/project.git --bareDépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
Permission denied au push | Permissions du bare repo | chown -R git:git repo.git |
remote: error: refusing to update checked out branch | Le repo n'est pas bare | Recréez avec git init --bare |
fatal: Interactive git shell is not enabled | git-shell actif | Normal, seules les commandes Git passent |
| Smart HTTP retourne 403 | http.receivepack non activé | git config http.receivepack true |
À retenir
Section intitulée « À retenir »- Un bare repository (
git init --bare) est la base d'un serveur Git - SSH + git-shell : méthode la plus simple et la plus sûre
- Smart HTTP : idéal derrière un pare-feu ou pour la CI/CD
- git daemon : lecture seule, pas d'authentification, usage limité
- Pour un usage plus complet (web UI, PR, CI), envisagez une plateforme Git
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Vérifiez que l'essentiel de ce guide est acquis. Les questions portent uniquement sur ce qui vient d'être expliqué ici.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Multi-dépôts et transfert : L'organisation du code quand un seul dépôt ne suffit plus.
- Git bundle : Le transport d'un dépôt entier vers un site sans accès réseau à votre serveur.
- Stockage des credentials : La gestion des identifiants que vos utilisateurs présenteront au serveur.