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.
Lokaler ausführender Hook nach einem Git-Push? (Post-Push)
schottisch
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" "[email protected]"
git push "[email protected]"
test $? -eq 0 && test -x "$POST_PUSH" &&
exec "$POST_PUSH" "$BRANCH" "[email protected]"
Gespeichert als git-push-wh
irgendwo in deinem PATH
kann 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
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
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
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 "[email protected]" && {
[[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "[email protected]"
}
}
compdef _git gp=git-push
Der compdef-Teil ist für ZSH.
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) &
Die
post-update
Hooks können für diesen Fall richtig ausgelöst werden?– Agniba
30. Januar 2019 um 8:21 Uhr