Astuce PHP & Git : Récupérer le hash du dernier commit d'un projet Git via PHP
Vous le savez peut être, le site skymac.org est construit à partir d'un CMS dont je m'occupe depuis maintenant 15 ans. Le code de ce CMS, CaMykS est suivi via le logiciel Git. Accessoirement, il est aussi disponible sur la plateforme GitHub.
Et dans le cadre du développement du CMS, j'ai eu besoin de réaliser un micro-développement très spécifique. J'ai eu besoin de récupérer le hash du dernier commit réalisé sur le repository Git, via PHP.
Premièrement, voici la commande que j'utilise pour récupérer le dernier commit du projet dans lequel je suis, directement dans mon terminal.
git rev-parse --verify HEAD
Maintenant, afin de ne pas avoir à "déplacer" le script PHP dans le dossier, il faut pouvoir exécuter cette commande depuis n'importe où, en indiquant le dossier du projet.
git --git-dir="/Library/WebServer/camyks/.git" rev-parse --verify HEAD
Comme vous pouvez le voir, le dossier du projet CaMykS est dans le dossier WebServer de macOS. Mais le plus important, c'est de ne pas oublier de spécifier le dossier de Git ".git" qui se trouve dans le dossier du projet.
Pour l'exécuter depuis PHP, rien de plus simple, il existe la commande shell_exec qui permet d'exécuter une commande dans un terminal et d'en récupérer les résultats. L'utilisation de la commande shell_exec doit être bien bordée afin qu'il n'y ait pas de possibilité pour des personnes extérieures de lancer n'importe quelle commande.
Ici, il s'agit d'un script PHP qui sera exécuté sur un serveur local, uniquement par une personne autorisée, il n'y a donc aucun soucis de sécurité.
Pour utiliser la fonction, nous pourrions donc écrire, en PHP :
$hash = shell_exec('git --git-dir="/Library/WebServer/camyks/.git" rev-parse --verify HEAD');
Malheureusement, cette commande ne va pas toujours fonctionner. En effet, le chemin vers l'application git n'est pas toujours connu de l'application gérant le serveur web. La dernière astuce, afin que tout cela fonctionne toujours, est donc d'indiquer le chemin complet vers git.
Si vous ne connaissez le chemin, vous pouvez le demander dans votre terminal
which git
Sur macOS, il est localisé dans /usr/local/bin/.
Je modifie donc la commande en conséquence
$hash = shell_exec('/usr/local/bin/git --git-dir="/Library/WebServer/camyks/.git" rev-parse --verify HEAD');
Ici, PHP obtient enfin correctement la valeur du hash du dernier commit réalisé.
Evidemment, la problématique de cet article et la mise en place de la solution sont très spécifiques, mais l'ensemble des astuces peuvent être utilisées et adaptées pour de nombreuses autres actions.