Éluder le problème des permissions de Git en php

26 mai 2017 / Marouen Mhiri / General

Plusieurs d'entre nous avaient sûrement eu le problème de ne pas pouvoir cloner/modifier ou faire des commits d'un dépot Git à partir d'un script PHP. Au fait le problème c'est que l'utilisateur apache (nommé généralement "www" ou "www-data"...) n'a pas les droits d'accés au dépot Git. Erreur du genre "error: cannot open .git/FETCH_HEAD: Permission denied"
Une des solutions serait d'utiliser les commandes Git en PHP avec un "nom d'utilisateur" et le "mot de passe" respectif. Mais c'est une méthode qui est un peu "dangereuse" coté sécurité ect...
Une autre solution serait d'ajouter cet utilisateur au dépot Git et lui associer un key ssh (ceci est malheureusement pas toujours possible - si on est pas administrateur du dépot ou bien si on a des droits restreints au dépot...).

Dans cet article je vais essayer de vous présenter une méthode "simple" qui nous permet de résoudre ce problème, mais qui aussi exige quelques efforts à faire.
L'idée conciste à créer un dépot vide et de l'ajouter comme deuxième référence distante à notre dépot d'origine.
Comme ça on aura tous les droits d'accés au deuxieme dépot créé du moment qu'il réside sur notre "intranet" ou sur notre disque carrément.

➤ Au début on va créer un dépot vide:

				
$ git init --bare nouveau_nom.git
				
			

➤ On change au dépot original et on ajoute la nouvelle référence distante (remote) - dans cet example on a nommé cette nouvelle référence "local" :

				
$ git remote add local [PATH-TO-nouveau_nom.git]
				
			

➤ Maintenant on doit pousser le master sur la nouvelle référence distante

				
$ git push local master
				
			

➤ Il serait aussi utile dans certains cas de pousser aussi les tags :

				
$ git push local --tags
				
			

➤ Maintenant on peut tout simplement cloner / modifier / commiter et pousser son travail sur le dépot Git distant :-).
Si on utilise la commande exec en PHP, il suffira d'écrite ce qui suit dans ls script pour pouvoir cloner le dépot :

				
exec( "git clone [PATH-TO-nouveau_nom.git] [répertoire-de-destination]" );
				
			

Exemple :

				
exec( "git clone /www/var/projects/myLocalRepo.git projet/projet1" );
				
			

IMPORTANT!!!
Du moment que notre dépot Git possède deux références distantes (dans notre cas "origin" et "local"), on est obligé avec chaque modification de pousser notre travail sur les deux références sinon on aura un problème de synchronisation.
Il y'a une possibilité d'écrire un script, qui s'occupera de daire le push sur toutes les références (plus d'infos).

Tags :

gitphp