Wie richte ich einen serverseitigen Pre-Receive-Hook ein?

Lesezeit: 4 Minuten

Benutzeravatar von Techie
Techie

Ich bin neu in Git-Hooks und serverseitiger Git-Funktionalität. Ich habe an clientseitigem Git gearbeitet, um meinen Code festzuschreiben und zu pushen, und wir verwenden Git-Merge Tools für das Application Lifecycle Management (ALM).. Ich versuche, Git-Hooks zu schreiben, um neue/geänderte Dateien im Repository zu testen. Ich kann clientseitige Hooks wie schreiben und testen pre-commit

Jetzt muss ich einen serverseitigen Git-Hook hinzufügen, um Dateien vor dem Zusammenführen mit dem Master zu überprüfen, da es eine Änderung zum Überspringen der clientseitigen Überprüfung gibt -no-verify Möglichkeit. Wenn ich einige Git-Hook-Tutorials durchgehe, pre-push Hook ist der serverseitige Hook. Ich habe versucht, einen Pre-Push-Hook zu erstellen, und es funktioniert auf der Client-Seite. Nun, wie kann es als serverseitiger Hook eingerichtet und erzwungen werden, Dateien zu überprüfen, wenn Benutzer versuchen, Änderungen sogar mit zu pushen --no-verify Option (sollte nicht auf dem Client gesteuert werden).

Meine große Frage ist, wie der Server-Hook ausgelöst wird, wenn wir das tun git push von der lokalen Filiale/dem Repo.

Haken erstellen:

Erstellte einen Hook namens pre-commit und platzierte ihn unter einem Ordner git_hooks/pre-push und auch drin .git/hooks/pre-push. Jetzt habe ich einen symbolischen Link für mein Pre-Push-Skript erstellt. Also, wann immer ich es tue git push Es wird .git/hooks/pre-push auslösen, was ein symbolischer Link für mein Skript ist git_hooks/pre-push

BEARBEITEN:

ich dachte pre-push Und pre-receive Haken sind die gleichen, da beide ausgelöst werden git push Befehl aber pre-push arbeitet nur clientseitig, pre-recieve arbeitet serverseitig. ich erschuf pre-receive Hook und schob es zum Master-Zweig. Jetzt, wenn ich es tue git push das bekommen Fehler: Hooks können nicht erzeugt werden/pre-receive: Keine solche Datei oder Verzeichnis.

Ich versuche das bei beiden Windows Und Linux Plattformen. Unter Windows erhalte ich diesen Fehler, unter Linux wird er nicht einmal ausgelöst. Ich platzierte pre-receive Haken Sie den Master-Branch auf beiden Plattformen an.

  • Habe ich deine Frage beantwortet?

    – Eugen Konkow

    25. Mai 2018 um 7:31 Uhr

  • @für Leute, die eine Antwort suchen: Fehler: Hooks können nicht erzeugt werden/pre-receive: Keine solche Datei oder Verzeichnis. Der Grund für diesen Fehler war falsch SHEBANG. Ich habe es geändert und erhalte keinen Fehler und der Pre-Receive-Hook funktioniert einwandfrei. Wir sollten platzieren pre-receive Haken Sie den Server .git/hook Ordner ein, dann wird dieser Hook immer dann ausgelöst, wenn Sie versuchen, Ihren Änderungsserver zu pushen. Es ist nicht erforderlich, dies im lokalen Repo zu haben.

    – Techie

    28. Mai 2018 um 7:27 Uhr


Benutzeravatar von Eugen Konkov
Eugen Konkow

Sie sollten nachsehen Serverseitige Haken Abschnitt Dokumentation.

Es gibt drei Hooks, mit denen Sie auf verschiedene Phasen des Git-Push-Prozesses reagieren können.

  • vorab erhalten
  • aktualisieren
  • nach Erhalt

Wenn Sie auf den Server pushen pre-receive Haken wird ausgelöst. Dann für jeden Zweig, den Sie geschoben haben update Haken wird ausgelöst. Wenn diese Haken fehlerfrei fertig sind, werden Ihre Patches angewendet und post-receive Haken wird ausgelöst

Genauer DOC um pre-receive Haken:

Dieser Hook wird von git-receive-pack aufgerufen, wenn es auf git push reagiert und Referenzen in seinem Repository aktualisiert. Unmittelbar bevor mit der Aktualisierung von Refs im Remote-Repository begonnen wird, wird der Pre-Receive-Hook aufgerufen. Sein Beendigungsstatus bestimmt den Erfolg oder Misserfolg der Aktualisierung.

UPD

Zum Einrichten pre-receive serverseitiger Haken Sie sollte Skript in platzieren .git/hooks Verzeichnis auf dem Server. und nenne es pre-receive. Das ist alles.
Sie sollten nicht erstellen hooks Verzeichnis in Ihrem Repo und committen Sie es. Der pre-receive Das Skript befindet sich außerhalb des Repos

UPD

Hier ist ein Beispielskript:

#!/bin/bash


# check each branch being pushed

echo "pre-receive HOOK"

while read old_sha new_sha refname
do

if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
    echo "Saw a conflict marker in $(basename "$refname")."
    git diff "$old_sha" "$new_sha" | grep -nE '^\+(<<<<<<<|>>>>>>>)'
    exit 1
fi

if git diff "$old_sha" "$new_sha" | grep -qE '^\+.*\s+$'; then
    echo "Saw whitespaces at EOL."
    git diff "$old_sha" "$new_sha" | grep -nE '^\+.*\s+$'
    exit 1
fi

done

exit 0

  • Vielen Dank für Ihre Hilfe. Ich dachte, Pre-Push und Pre-Receive sind gleich, aber beide sind unterschiedlich. Pre-Push wird auch für ausgelöst git push aber nur clientseitig. ich habe erschaffen pre-receive Haken, aber ich bekomme Fehler: Hooks können nicht erzeugt werden/pre-receive: Keine solche Datei oder Verzeichnis.

    – Techie

    25. Mai 2018 um 9:00 Uhr


  • @Rekha: Ich habe die Antwort aktualisiert. Sie haben gerade gesetzt pre-receive Skript auf dem Server in .git/hooks Verzeichnis. Das ist alles. Wie man dieses Skript richtig zum Laufen bringt, ist eine andere Frage.

    – Eugen Konkow

    25. Mai 2018 um 10:12 Uhr


  • Ja. Das habe ich auch hinzugefügt. hooks/pre-receive: Keine solche Datei oder Verzeichnis dies stellt nur .git/hooks dar. Die Datei ist vorhanden, zeigt aber immer noch einen solchen Fehler. Ich bin nicht in der Lage, es herauszufinden. Irgendwie löst es das Ereignis aus, funktioniert aber nicht richtig.

    – Techie

    25. Mai 2018 um 10:52 Uhr


  • @Rekha: Ich nehme an, Sie verwenden pre-push als pre-receive. Das kannst du nicht tun. Schau dir mein Skript an.

    – Eugen Konkow

    25. Mai 2018 um 12:10 Uhr

  • @ Eugen Konkov Danke für deine Hilfe.

    – Techie

    28. Mai 2018 um 7:31 Uhr

1445430cookie-checkWie richte ich einen serverseitigen Pre-Receive-Hook ein?

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

Privacy policy