Block ein git-Zweig geschoben
Hier ist die situation:
Habe ich ein öffentliches repository für mein open-source-app auf github.com. Aber jetzt würde ich gerne einige spezifische code, der nicht öffentlich sein (vielleicht verwende ich es in einer kommerziellen version meiner Anwendung).
Ich dachte, ich könnte das gleiche repository, und ich würde erstellen Sie eine "private" - Zweig in meinem git-repository, die würde ich nicht schieben.
Aber, Fehler passieren. Gibt es eine Möglichkeit zu verbieten, git jemals schob einen Zweig ab, um remote-Servern?
Ob es einen besseren Weg, um mit dieser situation umzugehen, wäre ich natürlich für Anregungen und Wünsche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen etwas hackish Lösung: erstellen Sie eine dummy-branch auf GitHub mit dem gleichen Namen wie die echte Verzweigung, und stellen Sie sicher, es würde nicht ein fast-forward merge. So, der push-Vorgang fehl.
Hier ist ein Beispiel.
Nun, dass die dummy-Zweig eingerichtet ist, können wir schaffen es lokal zu Abweichungen von den auf GitHub.
Nun, wenn wir versehentlich versuchen, zu schieben, wird es nicht mit einem nicht-fast-forward merge-Fehler:
pre-push
Haken und fügen Sie es in Ihrem lokalen repo, aber das script platziert werden müssen in jedem repo mit sowohl den Zugang zu der Branche und die Fähigkeit, zu schieben.-f
.Hier ist, wie die
pre-push
Haken Ansatz funktioniert, mit einem Zweig genanntdontpushthis
.Erstellen Sie diese Datei als
.git/hooks/pre-push
:Dies funktioniert, weil die Liste der refs geschoben wird weitergeleitet an die standard-Eingabe. So wird auch fangen
git push --all
.Machen Sie es ausführbar.
Tun dies in jedem lokalen repository.
Wenn Sie versuchen, zu schieben, um die Branche, und Sie werden sehen:
Offensichtlich ist dies so einfach, wie es aussieht, und nur verhindert, schob den Zweig mit der Bezeichnung "dontpushthis". Es ist also nützlich, wenn Sie versuchen zu vermeiden, direkt drücken, um einen wichtigen Zweig, wie
master
.Wenn Sie versuchen zu lösen das problem der Verhinderung vertrauliche Informationen preisgegeben, es könnte nicht ausreichend sein. Zum Beispiel, wenn Sie eine sub-Zweig von
dontpushthis
, der Zweig würde nicht erkannt werden. Benötigen Sie mehr sophisticated detection - man könnte schauen, um zu sehen, ob alle commits, auf die "dontpushthis" Filiale waren anwesend auf den aktuellen Zweig, für Instanz.Eine sicherere Lösung
Blick auf die Frage wieder, ich denke eine bessere Lösung wäre in diesem Fall:
git remote rm origin
) aus dem Arbeitsverzeichnis.git pull https://github.com/myproj/mypublicrepo
Diese Weise die privaten repo-Arbeitsverzeichnis nie hat überall könnte es zu schieben. Sie im wesentlichen ein ein-Wege-Ventil von öffentlichen Informationen an private, aber nicht zurück.
grep -e develop -e master
]]; then echo "Bitte keine push-direkt zu entwickeln oder master" exit 1 fi ``git remote set-url --push origin http://no-push-to-this-remote:99999/
Dieser setzt nur die push-URL, die remote auf eine ungültige url (Port 99.999 ungültig ist), so dass eine regelmäßige fetch/pull möglich ist, nur drückt dieser Fernbedienung wird nicht mit einem sofortigen Fehlermeldung. Das ist ein bisschen bequemer dann immer die URL für das abrufen.Einen touch-up von der .git/hooks/pre-push-Skript von @steve-bennett
Warum nicht einfach mal das Beispiel der pre-push mit aktuellen git-version?
Die Idee ist, beginnen die commit-Nachricht des ersten commit von Ihr privater Zweig mit dem Wort
PRIVATE:
.Nach Einstellung der pre-push-Skript, für jeden schieben Sie es überprüft die commit-Meldungen der log geschoben refs. Wenn Sie beginnen, mit PRIVATE: der push blockiert werden.
Hier sind die Schritte:
.git/hooks/pre-push
Vergangenheit das folgende Skript in es
Beispiel des Scheiterns
Machen die Niederlassung pushable wieder, kann man entweder den Haken entfernen oder, besser, ändern der commit-Nachricht zu entfernen Sie das Wort verboten.
Dieses Skript kann geändert werden, um nur eines verboten remote durch die überprüfung
remote_ref
. Aber in diesem Fall, vergessen Sie nicht, kopieren Sie diese Haken in alle repos empfangen darf dieser Branche.Gibt es mehrere Lösungen:
git-push
um zu verhindern, dass die push git pushpre-push
ist Ihr Kandidat.Können Sie erstellen, die ein Zweig, der nicht vorhanden ist in Ihrer remote-repository.
So, wenn Sie gerade tun:
Sie schieben nur die Zweige, die vorhanden sind, auf dem remote-repository.
Schauen Sie auch in
.git/config
(innerhalb des lokalen repository-Verzeichnis) - Datei nach dem erstellen der Filiale - Sie werden sehen, dass jede Ortsgruppe kann über verschiedene remote-repository zugewiesen. Sie können die Vorteile, die durch die Zuordnung von diesem Zweig zu trennen (private) - repository, aber das ist nicht die universal-Lösung (der Zweig kann noch geschoben werden, um Herkunft und Fernbedienung, wenn dies ausdrücklich bestellt, oder durch den Befehlgit push origin
).git push remote branch
- das ungültig macht beiden Ihrer obgit push origin my_private_branch
), warum glaubst du, git es nicht machen sollte? Und tatsächlich nehmen die meisten Menschen die ich kenne, sind mit nurgit push
(odergit push [remote]
), wenn es mehrere Filialen, Fernbedienungen und schreibengit push origin my_private_branch
zu sein scheint, viel weniger effizient geschrieben werden 100 mal am Tag.why do you think git should not do it?
- das ist der Punkt dieser Frage. Sie können rechts auf den zweiten Teil.Wenn Sie GitHub erstellen, können Sie einen Zweig auf GitHub mit dem gleichen Namen wie Ihre Niederlassung haben. Es gibt keine Notwendigkeit, drücken Sie auf eine beliebige verpflichtet, nur eine leere branch aus master oder was auch immer (man kann es in der GitHub-Schnittstelle, indem Sie den Zweig in den Zweig "" popdown und klicken
create branch <branch-name>
).Dann gehen Sie in den Zweig Einstellungen für das repository (z.B.
https://github.com/<user>/<repo>/settings/branches/<branch-name>
) und aktivieren Sie den Zweig Schutz für Ihre Branche. Werden Sie sicher, überprüfen Sie alle Felder, insbesondere die Prüfungen erfordern oder status überprüft-Boxen, die verbietet, die Niederlassung von geschoben, um direkt (es hätte geschoben werden, von einem pull-request), und auch sicher sein, überprüfen Sie das Feld, um Administratoren.Dann GitHub wird Ihnen nicht erlauben, um push-to-Zweig verwenden, auch wenn Sie
-f
. Sie erhalten eine Meldung wie