Sur un projet client hébergé sur un VPS OVH, l’équipe utilisait encore FileZilla pour mettre en ligne les mises à jour. Chaque déploiement prenait un quart d’heure et laissait toujours un doute : a-t-on bien copié tous les fichiers modifiés ? La solution la plus simple, avant même d’envisager un outil comme Deployer, tient en un dépôt Git bare et un hook post-receive.
Ce mécanisme existe depuis les débuts de Git et ne demande aucune dépendance supplémentaire côté serveur. Il convient parfaitement à un petit ou moyen projet WordPress géré par une seule personne ou une petite équipe, sans complexité d’orchestration.
Créer le dépôt bare sur le serveur
Sur le VPS, on crée un dépôt Git « nu », c’est-à-dire sans répertoire de travail, dédié à recevoir les pushs :
mkdir -p ~/repos/mon-site.git
cd ~/repos/mon-site.git
git init --bare
Ce dépôt ne contiendra jamais de fichiers visibles : il sert uniquement de point de réception. Le site lui-même vivra dans un dossier séparé, par exemple /var/www/mon-site, qui contient déjà WordPress installé et configuré (base de données, wp-config.php, éventuel .htaccess).
Écrire le hook post-receive

Le fichier hooks/post-receive du dépôt bare est un script exécuté automatiquement à chaque réception d’un push. On y place la logique de déploiement :
#!/bin/bash
TARGET="/var/www/mon-site"
GIT_DIR="/root/repos/mon-site.git"
while read oldrev newrev ref
do
if [ "$ref" = "refs/heads/main" ]; then
echo "Déploiement de la branche main..."
git --work-tree="$TARGET" --git-dir="$GIT_DIR" checkout -f main
cd "$TARGET"
composer install --no-dev --optimize-autoloader
wp cache flush --path="$TARGET/web/wp" --allow-root
fi
done
Il faut le rendre exécutable :
chmod +x ~/repos/mon-site.git/hooks/post-receive
Le paramètre --work-tree indique où extraire les fichiers, et --git-dir précise l’emplacement du dépôt bare. Cette combinaison permet de « déposer » les fichiers d’une branche dans un répertoire qui n’est pas lui-même un dépôt Git classique.
Configurer le dépôt local
Côté poste de développement, il suffit d’ajouter le VPS comme remote :
git remote add production ssh://user@monserveur.fr/~/repos/mon-site.git
git push production main
Chaque git push production main déclenche désormais le hook et met le site à jour. Le retour de la commande push affiche en direct la sortie du script, ce qui permet de repérer immédiatement une erreur Composer ou une commande WP-CLI en échec.
Gérer les fichiers qui ne doivent pas être écrasés
Le checkout -f écrase tout fichier présent dans le répertoire de travail qui serait aussi suivi par Git. Il faut donc veiller à ce que wp-config.php, le dossier wp-content/uploads et les caches ne soient jamais versionnés — un .gitignore soigné à la racine du projet évite les mauvaises surprises. Un oubli classique : versionner un wp-config.php de développement qui écrase discrètement la configuration de production lors du premier déploiement.
- Ajouter
wp-config.php,wp-content/uploads/et les fichiers de cache au.gitignore - Garder un
wp-config-sample.phpversionné comme référence - Vérifier avec
git statuscôté serveur qu’aucun fichier local n’a été modifié entre deux déploiements
Limites de la méthode
Ce mécanisme n’offre ni rollback automatique, ni bascule atomique : pendant l’exécution de composer install, le site peut afficher des erreurs si un visiteur charge une page au mauvais moment. Sur un site à fort trafic, mieux vaut basculer vers un système de releases horodatées avec lien symbolique, mais pour un site vitrine ou un blog à trafic modéré, ce compromis reste largement acceptable.
Sur les petits projets, je préfère toujours commencer par un hook Git basique. On migre vers un outil plus sophistiqué seulement quand la douleur devient réelle — pas avant.
En résumé
Un dépôt bare et un script post-receive suffisent à transformer un simple git push en déploiement complet, sans FTP, sans outil tiers, sans abonnement à un service externe. C’est la solution à connaître avant de complexifier son infrastructure : elle a l’avantage d’être entièrement lisible, modifiable en cinq minutes, et de ne dépendre que de Git lui-même, déjà installé sur toute machine de développement.