Lokaler ausführender Hook nach einem Git-Push? (Post-Push)

Lesezeit: 5 Minuten

Benutzeravatar von scotchi
schottisch

Ich habe angeschaut die Githooks-Manpage aber wenn mir nichts fehlt, sehe ich keine Option für lokale Post-Push-Git-Hooks. Ich hätte gerne einen, der die API-Dokumente auf meinem Webserver aktualisiert (für den ich bereits ein Skript habe), nachdem ich den Master-Zweig in das GitHub-Repo verschoben habe. Natürlich könnte ich einfach mein eigenes Skript schreiben, das den Git-Push und die Ausführung der API-Dokumente kombiniert, aber das fühlt sich etwas unelegant an.

  • Die post-update Hooks können für diesen Fall richtig ausgelöst werden?

    – Agniba

    30. Januar 2019 um 8:21 Uhr

Eine andere Lösung für dieses Problem ist ein Wrapper für git push das ausführt .git/hooks/pre-push Und .git/hooks/post-push Skripte vor und nach dem git push Forderung. Ein möglicher Wrapper könnte so aussehen:

#!/bin/sh

GIT_DIR_="$(git rev-parse --git-dir)"
BRANCH="$(git rev-parse --symbolic --abbrev-ref $(git symbolic-ref HEAD))"

PRE_PUSH="$GIT_DIR_/hooks/pre-push"
POST_PUSH="$GIT_DIR_/hooks/post-push"

test -x "$PRE_PUSH" &&
    exec "$PRE_PUSH" "$BRANCH" "$@"

git push "$@"

test $? -eq 0 && test -x "$POST_PUSH" &&
    exec "$POST_PUSH" "$BRANCH" "$@"

Gespeichert als git-push-wh irgendwo in deinem PATHkann es dann aufgerufen werden als git push-wh wenn Sie mit Haken schieben möchten.

  • Das ist brillant … Ich verwende separate Remotes: eine, auf der ich meinen Code hoste, ein bloßes Repo auf meinem Produktionsserver, also habe ich es hinzugefügt dieser Code zu meinem ~/.functions.sh und verwenden Sie ** Push-Ursprung ** ** Push-Produktion ** Es startet automatisch die Website (da dies in Push-Post definiert ist) in meinem Browser, sobald der Push abgeschlossen ist. Danke!

    – Saifur Rahman Mohsin

    24. September 2015 um 22:55 Uhr

  • Der aktuelle Code funktioniert nicht in Git-Arbeitsbäumen, um ihn zu beheben, ändern Sie einfach 3 Zeilen: ` GIT_DIR_=”$(git rev-parse –git-path hooks)” PRE_PUSH=”${GIT_DIR_}/pre-push” POST_PUSH= “${GIT_DIR_}/post-push” `

    – KaszpiR

    12. Juni 2019 um 16:21 Uhr

Benutzeravatar von ndbroadbent
ndbreit

Ich bin kürzlich auf das gleiche Problem gestoßen. Ich wollte einen Hook, damit ein Push von meinem Git-Submodul die neue Submodul-Referenz im ‘Superprojekt’ festschreibt.

Wie Chris erwähnte, ist der beste Weg, einfach einen Git-Alias ​​zu verwenden, wie folgt:

$ git config alias.xpush '!git push $1 $2 && update-server.sh'
# (remember the backslash before the ! if your shell requires it)

Dies fügt deiner .git/config-Datei Folgendes hinzu:

[alias]
  xpush = !git push $1 $2 && update-server.sh

Und jetzt, wenn Sie Folgendes eingeben:

$ git xpush

Ihre Änderungen werden übertragen und dann wird update-server.sh ausgeführt.

  • Ähm, was ist, wenn Sie in einer Filiale sind? und du machst das xpush? sollte nicht so etwas wie !git push $1 $2 && update-server.sh sein, damit Sie den Ursprungszweig angeben können?

    – Jlbelmonte

    11. November 2011 um 20:53 Uhr


  • Beachten Sie, dass das Überschreiben eines vorhandenen Befehls mit einem Git-Alias ​​nicht möglich ist, siehe stackoverflow.com/questions/3538774/…

    – Glanz

    8. Oktober 2018 um 19:14 Uhr


Benutzeravatar von Chris Johnsen
Chris Johnsen

Dieser Hook-Typ wird von Git nicht unterstützt. Es fällt außerhalb der gültige Gründe für einen Git-Hook
wie vom Git-Betreuer angegeben.

Die einleitende Bemerkung in der oben verlinkten Nachricht spricht fast direkt Ihren Fall an:

Ich mag Hooks nicht besonders, die handeln, nachdem eine Operation lokal initiiert wurde, und nur auf lokale Daten reagieren. Das liegt vielleicht daran, dass ich Git-Tools-Bausteine ​​immer noch mehr als andere Leute für Scripting auf höherer Ebene für geeignet halte.

PS Ein „Single Push“-Hinweis

  • Es gibt zu viele Vorbehalte für eine vollständige Erklärung, aber wenn Sie alles herausfinden können, sollten Sie in der Lage sein, mit den Details umzugehen.

Ein extra pushurl zu einem lokalen Repo mit einem „alternativen“ Objektspeicher könnte Ihnen eine Möglichkeit bieten, einen Push-Hook mit geringem Overhead lokal auszuführen. Aber wirklich, der Aufwand ist viel mehr als git push upstream && update-web-server (vielleicht in einem Shell-Alias, Git-Alias ​​oder Skript).

  • Dieselben Informationen finden Sie in: permalink.gmane.org/gmane.comp.version-control.git/71069

    – Jakub Narębski

    25. November 2009 um 21:24 Uhr

  • Bitte beachten Sie, dass ab 1.8.2 Git a hinzugefügt hat Vorschub Haken. Überprüfen Sie meine Antwort, um weitere Informationen zu erhalten.

    – Adrian Deccico

    27. November 2013 um 4:47 Uhr

Ab Git 1.8.2 wird vor der Push-Operation ein neuer Hook aufgerufen: Vorschub Wenn das Skript einen anderen Wert als 0 zurückgibt, wird der Push-Vorgang abgebrochen.

Erwähnung in den Release Notes: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167

Probe: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks–pre-push.sample

Benutzeravatar von pschmitt
pschmitt

Ich verwende dafür eine Funktion:

current_branch() {
    local ref=$(git symbolic-ref HEAD 2> /dev/null) || return
    echo ${ref#refs/heads/}
}

gp() {
    local post_push="$(git rev-parse --git-dir)/hooks/post-push"
    git push "$@" && {
        [[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "$@"
    }
}
compdef _git gp=git-push

Der compdef-Teil ist für ZSH.

Claudios Benutzeravatar
Claudio

Die Implementierung eines Post-Push-Hooks ist tatsächlich durch die Verwendung von möglich reference-transaction Haken. Nachdem ein Push durchgeführt wurde, aktualisiert git lokal den Remote-Tracking-Zweig und löst eine Referenztransaktion aus refs/remotes/REMOTE/BRANCH.

Hier ist ein Beispiel für einen Hook, der diese Technik verwendet:

#!/bin/bash
set -eu

while read oldvalue newvalue refname
do
    if [ $1 = committed -a $refname = refs/remotes/origin/main ]
    then
        exec .git/hooks/post-push
    fi
done

Dieses Skript muss das ausführbare Bit haben und eingefügt werden .git/hooks/reference-transaction. Der Haken läuft, nachdem der Hauptast zum Ursprung geschoben wurde. Fügen Sie Ihr tatsächliches Hook-Skript ein .git/hooks/post-push.

Erstellen Sie einfach eine pre-push Haken mit einem Schlaf an der Spitze. Stellen Sie sicher, dass der Ruhezustand lang genug ist, damit die Commits basierend auf Ihrer Netzwerkverbindungsgeschwindigkeit auf den Upstream-Server hochgeladen werden können. Fügen Sie am besten a hinzu & So führen Sie Ihr Skript im Hintergrund aus:

(sleep 30 && .git/hooks/post-push) &

1446080cookie-checkLokaler ausführender Hook nach einem Git-Push? (Post-Push)

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

Privacy policy