Git Post-Receive Hook funktioniert nicht

Lesezeit: 5 Minuten

Git Post Receive Hook funktioniert nicht
spanky

Mein Setup ist ein Windows-XAMPP-Server mit aktiviertem cURL und installiertem Git und Hudson. Hudson fragt Git jede Minute ab, um nach Änderungen zu suchen, und wenn es diese findet, erstellt es einen Build. Ich verwende diesen Build als meinen Testserver. Dies funktioniert gut.

Ich möchte einen Post-Receive-Hook auf meinem zentralen Remote-Repository einrichten, der die Force-Build-Funktion von Hudson ausführt.

Ich habe eine Post-Receive-Datei namens “post-receive” im Hooks-Verzeichnis in meinem zentralen Git-Repository erstellt, die aus den lokalen Zweigen der Entwickler gepusht wird. Sie pushen jeweils in ihren eigenen Branch im zentralen Repository. Ich möchte den Post-Receive-Build sofort nach jedem Push ausführen, anstatt Hudson jede Minute Git abfragen zu lassen.

Wenn ich eine Shell zum Remote-Server öffne und “post-receive” im Hooks-Ordner ausführe, wird es ausgeführt. Es wird nur nicht aufgerufen, wenn Leute von ihren lokalen Repository-Kopien auf das zentrale schieben.

Vielleicht erkläre ich das nicht richtig, aber so verstehe ich Git.

Der Post-Receive-Code besteht aus zwei Zeilen:

#!/bin/sh
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken

Auch hier, wenn ich eine Shell öffne und dies ausführe, funktioniert es, aber wenn jemand darauf drängt, passiert nichts, bis eine Minute oder weniger vergeht, Hudson erkennt, dass Git geändert wurde, und dann wird es erstellt.

Bei Bedarf kläre ich gerne auf. Jede Hilfe wird sehr geschätzt.

BEARBEITEN: Nachdem ich damit herumgespielt habe, habe ich das Gefühl, dass der Post-Empfang möglicherweise nicht ausgeführt wird, weil die Refs nicht aktualisiert werden. In der git-Dokumentation steht

Es wird einmal auf dem Remote-Repository ausgeführt, nachdem alle Refs aktualisiert wurden.

Bedeutet dies, dass es nicht ausgeführt wird, wenn nichts aktualisiert wird? Und wenn ja, bin ich mir ziemlich sicher, dass die Dinge sowieso aktualisiert werden, also sollte es nicht zutreffen.

Hier ist mein Prozess: Nehmen Sie Änderungen lokal vor. Commit-Änderungen. Push von meinem HEAD zum Remote-Zweig namens ‘mybranch’ (nicht zum Master-Zweig, der ausgecheckt ist) Dies ist der Punkt, an dem mein Hook ausgeführt werden soll.

  • Der Benutzer, den Ihr Git-Daemon ausführt, hat die Berechtigung, dieses Skript auszuführen?

    – jweyrich

    9. Februar ’11 um 21:51

  • Nicht sicher. Es führt es aus, wenn ich es über Git Bash ausführe, aber nicht, wenn ich darauf dränge. Wie würde ich diese Berechtigungen überprüfen?

    – spanky

    9. Februar ’11 um 21:52

  • Die richtige Berechtigung hängt davon ab, wie Sie Ihr Repository freigeben, und von den tatsächlichen Konfigurationen. Allerdings sagt Ihnen msquared, wie Sie allen Benutzern/Gruppen ausführbare Berechtigungen erteilen können, also sollte es funktionieren, wenn das Problem tatsächlich darin liegt.

    – jweyrich

    9. Februar ’11 um 21:58 Uhr


  • Die Datei ist ausführbar, sie wird nur nicht oder nicht richtig ausgeführt, wenn ich git-push. Irgendwelche anderen Ideen?

    – spanky

    10. Feb. ’11 um 0:40

  • Fügen Sie eine echo-Anweisung in Ihren Post-Receive-Hook ein, um zu sehen, ob er tatsächlich ausgeführt wird, zB “echo Hook ran!” — git sendet es an den Anrufer.

    – ebneter

    10. Feb. ’11 um 2:04

Git Post Receive Hook funktioniert nicht
msquared

Bitte prüfen Sie, ob Ihre Datei über ausführbare Rechte verfügt. Andernfalls kann es nicht ausgeführt werden. Etwas wie rwxr-xr-x sollte ausreichen.

Sie können das fehlende Bit mit hinzufügen

$ chmod +x /path/to/post-receive

  • Tat dies. Es ist jetzt rwxr-xr-x, und denken Sie daran, dass es von der Git-Bash-Shell ausgeführt wurde, aber immer noch nicht allein per Push ausgeführt wurde.

    – spanky

    10. Feb. ’11 um 0:37

Welche Transportmethode verwenden Sie, um zum Repo zu pushen?

Hooks werden nur ausgeführt, wenn ‘intelligente’ Transportprotokolle wie ssh und die cgi-Implementierung von http verwendet werden. Bei anderen ‘dummen’ Transportprotokollen wie ftp, rsync und der älteren http-Implementierung werden Hooks nie ausgeführt. Ich gehe davon aus, dass das Git-Protokoll Hooks ausführen würde, aber es wurde nie als eine gute Idee angesehen, dieses Protokoll zu übertragen.

  • Oh Mann. Ich verwende http. Scheitern. Irgendwelche Ratschläge zum Wechseln zu einer anderen Version, ohne das zu ruinieren, was ich derzeit im Repo habe? Ich werde auch in mich hineinschauen.

    – spanky

    10. Feb. ’11 um 17:31

  • Sie können HTTP weiterhin verwenden, wenn Sie verwenden kernel.org/pub/software/scm/git/docs/git-http-backend.html aber ich weiß nichts über den Versuch, es unter Windows einzurichten. Sie können auch einen SSH-Server entweder mit einem nativen Windows-Server oder mit Cygwin einrichten, mit dem ich auch keine Erfahrung habe. Wie Sie herausgefunden haben, ist Windows nicht gerade das freundlichste Betriebssystem zum Hosten von Git-Repos.

    – Pfeilmeister

    10. Feb. ’11 um 17:37

  • @Arrowmaster Ihr Kommentar erwies sich als nützlich für mich, um ein Spielzeug-Repository über HTTP einzurichten, und ich brauchte auch die Ausführung der Hooks. Danke!

    Benutzer59634

    12. November ’13 um 4:06

  • @Arrowmaster – wie kann ich überprüfen, welche Transportmethode ich verwende?

    – Darius

    6. Januar ’15 um 7:26

  • Wenn ich in Remote-Repositorys von Git-Erweiterungen eine URL sehe, die mit [email protected] beginnt, bedeutet dies die SSH-Transportmethode, oder? Was kann dann noch der Grund sein, warum er nicht feuert?

    – Darius

    6. Januar ’15 um 8:31

Alle diese Antworten sind nützlich, aber es stellte sich heraus, dass ich das “bin” -Verzeichnis von git in meiner PATH-Variablen benötigte. Ich hatte nur das “cmd”-Verzeichnis. Hinzugefügt c:my_path_to_gitgitbin zu PATH und es funktioniert gut. Ich habe diese Antwort durch Versuch und Irrtum gefunden und mir das Apache-Fehlerprotokoll angesehen. Ich danke Ihnen allen für Ihre Hilfe!

Versuchen Sie, den vollständigen Pfad zu verwenden, um in der Post-Empfangsdatei zu curlen, da PATH anders sein kann als bei der manuellen Ausführung des Skripts.

Wenn Sie sehen möchten, in welcher Umgebung ein Post-Empfangs-Skript ausgeführt wird:

#!/bin/sh
export > file

oder einfach (es werden Umgebungsvariablen nach dem Pushen in das Repo angezeigt)

#!/bin/sh
export

Außerdem bin ich mir nicht sicher, wie das Ausführen von Shell-Scrips unter Windows funktioniert, daher könnte #!/path/to/installed/sh anstelle von #!/bin/sh helfen

Ich denke, die einfache Antwort ist, dass Sie den Inhalt der Post-Receive-Hook-Serverseite anstelle der Clientseite verschieben müssen

  • Willkommen bei Stapelüberlauf! Das ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Wiederholung können Sie Kommentare posten.

    – Matte

    13. Okt ’16 um 15:16

  • Willkommen bei Stapelüberlauf! Das ist wirklich ein Kommentar, keine Antwort. Mit etwas mehr Wiederholung können Sie Kommentare posten.

    – Matte

    13. Okt ’16 um 15:16

.

390650cookie-checkGit Post-Receive Hook funktioniert nicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy