2017-05-24 4 views
0

Ich habe zwei Fernbedienungen, eine für die Produktion und eine für GitHub. Da ich bestimmte Dateien zu den Produktionen pushen muss, die nicht auf GitHub landen dürfen, möchte ich eine Filiale einschränken, um Unfälle zu vermeiden.Beschränken Sie Push auf bestimmte Fernbedienungen für einen Zweig

Gibt es eine Möglichkeit, meinem Git-Client zu sagen, dass es nie den Zweig "deploy" auf Remote "Github" schieben und nur diesen Zweig auf "Produktion" schieben soll?

Antwort

2

kowsky's answer ist der richtige, vorausgesetzt, Ihr Git ist mindestens 1.8.2 (und wenn nicht, sollten Sie upgraden :-)). Die verknüpften Beispiele sind jedoch fehlerhaft.

Die pre-push hook ist mit zwei Argumenten aufgerufen, die vorsehen:

  • der Name des entfernten, wenn ein Remote-Namen verwendet wird, sonst die URL
  • die URL (das Ergebnis der Fern der genannten Expandieren wenn eine benannte Fern verwendet wird)

Was ist geschoben werden, was etwas, das Sie an der Zeit, die Sie git push laufen angeben ist, an dem Haken versehen ist auf seinem Standardeingang. Dies ist, wo die zwei verknüpften Beispiele beide gebrochen sind.

Wenn Sie laufen:

git push github refspec1 refspec2 ... refspecN 

dann die Referenz (en) gedrückt werden diejenigen in dieser Befehlszeile angegeben sind.

Wenn Sie laufen:

git push github 

(ohne refspecs), die Menge des Zweiges ist gedrückt werden ... na ja, es ist kompliziert, aber in modernen Git, wird standardmäßig auf den aktuellen Zweig .

Die Probe vorgeSchubHaken nehmen dass nur der Stromzweig zu gedrückt wird. Da, dass die moderne Standard ist, werden die Proben wahrscheinlich funktionieren, bis Sie versehentlich laufen:

git push github deploy 

(während auf, sagen wir, master), und dann werden sie nicht, und können Sie traurig sein. :-)

Um sie zu beheben, verwenden Sie ein githook, das z.:

#! /bin/sh 
[ "$1" = github ] || exit 0 # allow if not pushing to github 
while read lref lhash rref rhash; do 
    case "$lref" in 
    refs/heads/deploy) 
     echo "error: attempt to push 'deploy' branch to github" 1>&2 
     exit 1;; 
    esac 
done 

Dies ermöglicht:

git push github master:deploy 

(die oder aktualisiert, eine deploy auf Remote-github schafft aber lokale Zweig master, nicht lokalen Zweig deploy verwendet wird), während das Verbot:

git push github deploy:oops 

(die schiebt die lokaledeploy zu einem Zweig mit dem Namen oops).

Wenn Sie kompliziertere Regeln haben möchten, schreiben Sie sie auf. Beachten Sie, dass Sie $2 sowie $1 überprüfen können, wenn Sie verhindern möchten, dass git push https://github.com/... Ihren eigenen Haken umgeht. Natürlich, wenn Sie entschlossen sind, Ihren eigenen Haken zu umgehen, könnten Sie einfach git push --no-verify ausführen, um Ihren Haken zu deaktivieren.

4

Git Hooks sind was Sie suchen. Sie können einen Pre-Receive-Hook auf der Serverseite einrichten, der für alle Benutzer geeignet ist, die versuchen, zu Ihrem Repo zu wechseln, der abhängig von der aktuellen Verzweigung oder einem ähnlichen lokalen Pre-Push-Hook Pushs akzeptiert oder ablehnt. Beispiele für letztere sind here und here.

Verwandte Themen