2016-06-10 14 views
4

Ich habe einen Webhook in meinem Repository github, die Post auf der Hook-URL auf meinem Live-Server zum Ausführen Pull-Befehl zum Aktualisieren meiner Repo-Dateien auf dem Server.'git pull' Befehl funktioniert von Terminal, aber nicht mit PHP shell_exec() über Git-Repository-Hook

Das Problem ist die Haken-Datei, die ich geschaffen habe, in der /var/www/site/web/hookfile.php ist (die Post-Anforderung wird dorthin zu gehen. Ich habe auch die Reaktion des Körpers bin immer)

und Meine Repo-Dateien befinden sich in/var/www/git-repo/

es nicht die git-repo aktualisieren, wenn ich etwas an meine Github-Repository schieben. Ich führe diesen Befehl mit Terminal und seine Arbeit.

cd /var/www/git-repo && git pull 

Aber durch meine php seine Datei nicht funktioniert

shell_exec('cd /var/www/git-repo && git pull') 
+0

Was ist shell_exec zurück? –

+0

nichts. Kein Fehler @JonStirling –

+0

Nichts? Wie es in 'null' zurückgibt? –

Antwort

5

shell_exec() fail leise nur, weil STDOUT berichten und nicht STDERR.

Versuchen mit:

echo shell_exec("cd /var/www/git-repo && /full/path/to/bin/git pull 2>&1"); 

Normalerweise ist ein Berechtigungsfehler und behoben werden konnte Erlaubnis für den Benutzer hinzufügen, die PHP-

chown -R www-agent:www-agent repository/ 

Aber könnte auch ein Verbindungsfehler ausführen (Apache?) zum entfernten Repository (Authentifizierung, ssh-Schlüssel, ...).

+0

vollständiger Pfad bedeutet, wo meine /.Git befindet? @dario –

+0

ja @ Harish-Kumar. Sie können 'which git' in einem Terminal ausführen, um es zu bekommen – Dario

+1

bekommen diesen Fehler: kann .git/FETCH_HEAD nicht öffnen: Berechtigung verweigert –

0

ich vor allem in Ihrer PHP-Datei einen Test gegen Ihre Server-Instanz läuft alle Fehlermeldungen Ausgabe auf dem Bildschirm zu bekommen, weil exec() -Familie von Funktionen einfach still und nur Bericht STDOUT scheitern und nicht STDERR:

echo shell_exec("cd /website/root/htdocs && git checkout . && git status 2>&1"); 

in meinem Fall war dies ein Fehler, dass es git Befehl wegen fehlender binärer Pfad für Apache Benutzer nicht gefunden finden konnte. Daher muss der Binärdatei von git ein vollständiger Pfad bereitgestellt werden. Es kann sie manuell erhalten werden durch Auffinden oder Laufen in der Schale:

/usr/local/git/bin/git 

Ein vollständiger Pfad mit git Befehl z:

'which git' 

es zurückgegeben (weitere YOU_FULL_GIT_BINARY_PATH_HERE genannt) '/ usr/local/git/bin/git status' führt jetzt git-Befehle gut aus.

Eine andere Sache ist, um sicherzustellen, dass der Benutzer Ihres Webservers über ausreichende Berechtigungen zum Lesen/Schreiben in Ihren Repo-Ordner/Dateien verfügt. Ich habe gesetzt Mine von Apache Benutzer gehört zu werden (Centos 6.8 andere Versionen könnten www sein: www oder www-data: www-data etc.):

chown -R apache:apache YOUR_WEB_OR_REPO_FODLER 

Um alle neu hinzugefügten Dateien richtigen Berechtigungen erben, um sicherzustellen, run:

Die oben genannten sollten Ihr Skript jetzt Befehle ausführen. Obwohl es die git-Passwortaufforderung nicht überwindet, um den "git pull" -Befehl für einen git-Benutzer in der Datei YOUR_WEB_OR_REPO_FODLER/.git/config zu verwenden.Laufen unter Befehl in Repo:

git config credential.helper store 

command wird nach einem Kennwort fragt und lassen Sie es lokal speichern. Bitte beachten Sie, dass Ihr gespeichertes Passwort unverschlüsselt und nur durch das Dateisystem, z. in /root/.git-berechtigungen. Dies ermöglicht es, "git pull" auszuführen, ohne nach einem Passwort zu fragen.

Es ist nicht ideal für meine vollautomatische Continuous Integration-Umgebung, die Test-VPS on demand bereitstellt, da sie das git user (definiert in Repos .git/config git) Passwort mindestens einmal manuell eingeben muss.

Seit meiner Umgebung immer auf Code aus der Ferne der Herkunft/Masterkopie laufen soll ich auch bin mit

/YOU_FULL_GIT_BINARY_PATH_HERE/git checkout . 

vor ‚git pull‘ Aufruf alle lokalen Änderungen verloren gehen, um sicherzustellen, immer abwechselnd ein harten stattdessen zurückgesetzt tun mit :

/YOU_FULL_GIT_BINARY_PATH_HERE/git fetch origin 
/YOU_FULL_GIT_BINARY_PATH_HERE/git reset --hard origin/master