Der Git-Post-Receive-Hook gibt den Fehler „Befehl nicht gefunden“ aus, scheint aber ordnungsgemäß zu laufen und es treten keine Fehler auf, wenn er manuell ausgeführt wird.

Der Git-Post-Receive-Hook gibt den Fehler „Befehl nicht gefunden“ aus, scheint aber ordnungsgemäß zu laufen und es treten keine Fehler auf, wenn er manuell ausgeführt wird.

Ich habe einen Post-Receive-Hook, der auf einem zentralen Git-Repository läuft, das mit Gitolite eingerichtet wurde, um einen Git-Pull auf einem Staging-Server auszulösen. Er scheint ordnungsgemäß zu funktionieren, gibt aber beim Ausführen den Fehler „Befehl nicht gefunden“ aus. Ich versuche, die Fehlerquelle zu ermitteln, hatte aber bisher kein Glück. Das manuelle Ausführen derselben Befehle erzeugt keinen Fehler.

Der Fehler ändert sich, je nachdem, was im Commit gemacht wurde, das in das zentrale Repository gepusht wird. Wenn beispielsweise „git rm“ committet und in das zentrale Repository gepusht wurde, lautet die Fehlermeldung „remote: hooks/post-receive: line 16: Removed: command not found“ und wenn „git add“ committet und in das zentrale Repository gepusht wurde, lautet die Fehlermeldung „remote: hooks/post-receive: line 16: Merge: command not found“. In beiden Fällen funktioniert der „git pull“-Ausführung auf dem Staging-Server trotz der Fehlermeldung ordnungsgemäß.

Hier ist das Post-Receive-Skript:

#!/bin/bash
#
# This script is triggered by a push to the local git repository.  It will
# ssh into a remote server and perform a git pull.
#
# The SSH_USER must be able to log into the remote server with a
# passphrase-less SSH key *AND* be able to do a git pull without a passphrase.
#
# The command to actually perform the pull request on the remost server comes
# from the ~/.ssh/authorized_keys file on the REMOTE_HOST and is triggered
# by the ssh login. 

SSH_USER="remoteuser"
REMOTE_HOST="staging.server.com"

`ssh $SSH_USER@$REMOTE_HOST` # This is line 16

echo "Done!"

Der Befehl, der den Git Pull auf dem Staging-Server ausführt, befindet sich in der Datei ~/.ssh/authorized_keys des SSH-Benutzers und lautet:

command="cd /var/www/staging_site; git pull",no-port-forwarding,no-X11-forwarding,no-agent-forwarding, ssh-rsa AAAAB3NzaC1yc2EAAAABIwAA... (the rest of the public key)

Dies ist die tatsächliche Ausgabe, wenn ich eine Datei aus meinem lokalen Repository entferne, sie lokal festschreibe und in das zentrale Git-Repository pushe:

ben@tamarack:~/thejibe/testing/web$ git rm ./testing
rm 'testing'
ben@tamarack:~/thejibe/testing/web$ git commit -a -m "Remove testing file"
[master bb96e13] Remove testing file
1 files changed, 0 insertions(+), 5 deletions(-)
delete mode 100644 testing
ben@tamarack:~/thejibe/testing/web$ git push 
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 221 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: From [email protected]:testing
remote:    aa72ad9..bb96e13  master     -> origin/master
remote: hooks/post-receive: line 16: Removed: command not found # The error msg
remote: Done!
To [email protected]:testing
aa72ad9..bb96e13  master -> master
ben@tamarack:~/thejibe/testing/web$

Wie Sie sehen, gelangt das Post-Receive-Skript zur echo "Done!"Zeile, und wenn ich auf dem Staging-Server nachschaue, git pullwurde es erfolgreich ausgeführt, aber es erscheint immer noch diese lästige Fehlermeldung.

Ich bin für Vorschläge, wo ich nach der Quelle der Fehlermeldung suchen soll, sehr dankbar. Ich bin versucht, stderr nach /dev/null umzuleiten, würde aber lieber wissen, wo das Problem liegt.

Antwort1

Der Hook wird möglicherweise ausgeführt, ohne dass PATH auf einen vernünftigen Wert eingestellt ist. Haben Sie versucht, den vollständigen Pfad zu verwenden ssh? Sehen Sie sich andernfalls die Umgebungsvariablen an, wenn Ihr Skript ausgeführt wird. Sie können „export“ verwenden, um eine Liste davon auszugeben. Sie werden wahrscheinlich nicht das sein, was Sie denken.

verwandte Informationen