Hier ist mein aktueller Hook in einem nackten Repo, das sich auf dem Server des Unternehmens befindet: git push origin master
Dieser Hook wird
an Assembla weitergeleitet. Was ich brauche, ist, nur einen Zweig (im Idealfall Master) zu pushen, wenn jemand Änderungen an diesem Zweig auf unserem Server überträgt, und Pushs an andere Zweige zu ignorieren. Ist es möglich, den Zweig aus einem Bare-Repo auszuwählen und nur diesen Zweig nach Assembla zu verschieben?
git
repository
hook
git-bare
Jorge Guberte
quelle
quelle
git push origin master
schiebt nur denmaster
Zweig zurorigin
Fernbedienung, von der ich annehme, dass sie als Assembla definiert ist. Wollen Sie damit sagen , dass Sie brauchen auslösen den Haken nur , wenn jemand drückt zumaster
, im Gegensatz zufeature1
, oder so etwas?Antworten:
Ein Post-Receive-Hook erhält seine Argumente von stdin in der Form
<oldrev> <newrev> <refname>
. Da diese Argumente von stdin stammen und nicht von einem Befehlszeilenargument, müssen Sieread
stattdessen verwenden$1 $2 $3
.Der Post-Receive-Hook kann mehrere Zweige gleichzeitig empfangen (z. B. wenn jemand a ausführt
git push --all
), daher müssen wir den auchread
in einewhile
Schleife einschließen.Ein funktionierendes Snippet sieht ungefähr so aus:
quelle
#!/bin/sh
statt#!/bin/bash
?refs/heads/master
stattdessen suchenrefs/tags/master
, sollten Sie in Ordnung sein. Es kann andere Randfälle wie diesen geben, an die ich nicht denken kann. Es könnte eine gute StackOverflow-Frage für sich sein.if branch=$(git rev-parse --symbolic --abbrev-ref $refname 2>/dev/null); then
damit git sich nicht beschwert, wenn ich einen Zweig entferne.Der letzte Parameter, den ein Post-Receive-Hook auf stdin erhält, ist der, der ref geändert wurde. Daher können wir damit überprüfen, ob dieser Wert "refs / Heads / Master" war. Ein bisschen Rubin ähnlich dem, was ich in einem Post-Receive-Hook verwende:
Beachten Sie, dass für jede Referenz, die gedrückt wurde, eine Zeile angezeigt wird. Wenn Sie also mehr als nur den Master gedrückt haben, funktioniert dies weiterhin.
quelle
Stefans Antwort hat bei mir nicht funktioniert, aber das hat funktioniert:
quelle
Keine der oben genannten Lösungen hat bei mir funktioniert. Nach vielem Debuggen stellt sich heraus, dass die Verwendung des Befehls 'read' nicht funktioniert. Stattdessen funktioniert das Parsen von Befehlszeilenargumenten auf die übliche Weise einwandfrei.
Hier ist der genaue Hook nach dem Update, den ich gerade erfolgreich unter CentOS 6.3 getestet habe.
UPDATE: Noch seltsamer ist, dass der Pre-Receive-Hook seine Eingabe über stdin erhält und daher mit 'read' liest (wow, hätte nie gedacht, dass ich das sagen würde). Der Post-Update-Hook funktioniert bei mir immer noch mit 1 US-Dollar.
quelle
post-receive
Haken und nicht fürpost-update
Haken bestimmt sind. Sie nehmen ihre Beiträge auf unterschiedliche Weise auf.post-receive
nimmt stdin wie hier angegeben: git-scm.com/book/en/v2/Customizing-Git-Git-HooksDie Antwort von @pauljz funktioniert gut für bestimmte Git-Hooks wie
pre-push
, hat aberpre-commit
keinen Zugriff auf diese Variablenoldrev newrev refname
Also habe ich diese alternative Version erstellt, die für Pre-Commit oder wirklich und Hook funktioniert. Dies ist ein
pre-commit
Hook, der einhusky
Skript ausführt, wenn wir NICHT in dermaster
Verzweigung sind.Ich hoffe das hilft jemandem. Sie können ganz einfach Änderungen an Ihren Anforderungen vornehmen, alles zwischen den Anweisungen
if
undfi
.quelle
Ich hatte ein PHP-Skript für mich geschrieben, um diese Funktionalität auszuführen.
https://github.com/fotuzlab/githubdump-php
Hosten Sie diese Datei auf Ihrem Server, repo-Root und definieren Sie die URL in Github-Webhooks. Ändern Sie 'allcommits' in Zeile 8 mit Ihrem Filialnamen und fügen Sie Ihren Code / Ihre Funktion in Zeile 18 hinzu.
z.B
quelle
Einfacher Ansatz,
git hook
schriftlichEinfach - mehr Infos zu diesem großartigen Link- Hooking-System
quelle