Wie man verschiedene lokale Git-Zweige zu Heroku / Master schiebt

402

Heroku hat die Politik, alle Zweige außer "Meister" zu ignorieren.

Ich bin mir zwar sicher, dass die Designer von Heroku hervorragende Gründe für diese Richtlinie haben (ich vermute für die Speicher- und Leistungsoptimierung), aber für mich als Entwickler ist die Konsequenz, dass ich auf einfache Weise einen einfachen Weg möchte, egal an welchem ​​lokalen Themenbereich ich arbeite um Herokus Master auf diesen lokalen Themenzweig umzustellen und einen "git push heroku -f" auszuführen, um den Master auf Heroku zu überschreiben.

Was ich durch das Lesen des Abschnitts "Pushing Refspecs" von http://progit.org/book/ch9-5.html erhalten habe, ist

Git Push -f Heroku Local-Topic-Zweig: Refs / Heads / Master

Was ich wirklich möchte, ist eine Möglichkeit, dies in der Konfigurationsdatei so einzurichten, dass "git push heroku" immer die oben genannten Schritte ausführt und den Zweig für lokale Themen durch den Namen meines aktuellen Zweigs ersetzt. Wenn jemand weiß, wie das geht, lass es mich wissen!

Die Einschränkung dafür ist natürlich, dass dies nur dann sinnvoll ist, wenn ich der einzige bin, der auf diese Heroku-App / dieses Heroku-Repository zugreifen kann. Ein Test- oder QS-Team könnte ein solches Repository verwalten, um verschiedene Kandidatenzweige auszuprobieren, aber sie müssten sich koordinieren, damit sie sich alle darauf einigen, welchen Zweig sie an einem bestimmten Tag darauf drängen.

Natürlich wäre es auch eine sehr gute Idee, ein separates Remote-Repository (wie GitHub) ohne diese Einschränkung für die Sicherung aller Daten zu haben. Ich würde diesen einen "Ursprung" nennen und "Heroku" für Heroku verwenden, so dass "Git Push" immer alles zum Ursprung sichert und "Git Push Heroku" jeden Zweig, auf dem ich mich gerade befinde, zu Herokus Hauptzweig schiebt und ihn überschreibt im Bedarfsfall.

Würde das funktionieren?

[entferntes "Heroku"]
    url = [email protected]: my-app.git
    push = + refs / Heads / *: Refs / Heads / Master

Ich würde gerne von jemandem hören, der mehr Erfahrung hat, bevor ich anfange zu experimentieren, obwohl ich wahrscheinlich eine Dummy-App auf Heroku erstellen und damit experimentieren könnte.

Was das Abrufen betrifft, ist es mir eigentlich egal, ob das Heroku-Repository schreibgeschützt ist. Ich habe immer noch ein separates Repository wie GitHub zum Sichern und Klonen aller meiner Arbeiten.

Fußnote: Diese Frage ähnelt der Good Git-Bereitstellung mit der Zweigstrategie mit Heroku , ist jedoch nicht ganz dieselbe .

Lawrence I. Siden
quelle
1
Die derzeit am meisten gewählte Antwort ist die idiomatische Art und Weise, dies zu tun (und Imo die wirklich richtige Antwort)
Selali Adobor
Eine alternative https-Ressource zum Pushen von Refspecs: Git SCM-Dokumentation zum Pushen von Refspecs .
Dylan Landry

Antworten:

131

Bei Verwendung eines Platzhalters musste dieser auf beiden Seiten der Referenz vorhanden sein, sodass er +refs/heads/*:refs/heads/masternicht funktioniert. Aber Sie können verwenden +HEAD:refs/heads/master:

git config remote.heroku.push +HEAD:refs/heads/master

Sie können dies auch direkt mit git push tun :

git push heroku +HEAD:master
git push -f heroku HEAD:master
Chris Johnsen
quelle
4
Was ist der Unterschied zwischen diesen beiden Befehlen oder müssen wir beide ausführen
Saad Masood
2
@ SaadMasood: Die letzten git pushBefehle machen dasselbe. Siehe git push --helpfür die Bedeutung der -fOption und die +in der Referenz.
Chris Johnsen
4
@ Chris Johnson: Könnten Sie uns bitte sagen, was die -f-Parameter bedeuten, anstatt die Jungs hier zu RTFMing?
AHH
@AHH -fsteht für Kraft . Es funktionierte für mich mit Jassas Antwort .
Herr Tao
@ Chris Johnson: Wird HEAD verwendet, um nur die neueste Version der App und nicht den gesamten Verlauf zu pushen?
Cameron Wilby
1566

Siehe https://devcenter.heroku.com/articles/git#deploying-code

$ git push heroku yourbranch:master
Jassa
quelle
24
Möglicherweise ist eine Kraft erforderlich.
Scott Stafford
Dies scheint nicht mehr zu funktionieren, obwohl sie noch in ihren Dokumenten enthalten sind. Selbst mit Gewalt lehnt der Server den Push ab und sagt, dass er den Hauptzweig nicht löschen kann.
Dave Meehan
3
@ DaveMeehan das funktioniert immer noch. Sie versuchen, git push :masterden Hauptzweig zu löschen, indem Sie ihn mit nichts überschreiben. Das ist etwas anderes als das Überschreiben mit einem anderen Zweig. Heroku verfügt wahrscheinlich über Sicherheitsvorkehrungen, um das Löschen des Hauptzweigs zu verhindern.
Dennis
Dies ist eine großartige Lösung
Ajay Kumar
2
@nxmohamad Dies ist nur möglich, wenn sich Ihr Zweig hinter dem Hauptzweig befindet und Sie den aktuellen Code auf Heroku überschreiben möchten.
Ricks
64
git push -f heroku local_branch_name:master
Tomasz Mazur
quelle
3
Achten Sie darauf, dies verwendet -foder --force, und es ist immer am besten sicherzustellen, dass Sie wissen, was Sie tun, wenn Sie Druck erzwingen.
MiFiHiBye
@ tomasz-mazur warum braucht es -f?
Nxmohamad
Ja, in einigen Fällen müssen wir möglicherweise -f verwenden, z. B. um mit mehreren in Bearbeitung befindlichen Zweigen zu arbeiten und das in Heroku zu ersetzen und den Arbeitszweig zu testen. Bitte geben Sie Ratschläge, falls wir eine andere bessere Möglichkeit zum Testen haben
Fahad,
es funktioniert auf meinem Computer, danke für die Antwort. Ist diese Syntax tatsächlich im normalen Github-Repository gültig?
Luk Aron
10

Der sicherste Befehl, um verschiedene lokale Git-Zweige an Heroku / master zu senden.

git push -f heroku branch_name:master

Hinweis: Obwohl Sie ohne -f pushen können, wird das -f (Force-Flag) empfohlen, um Konflikte mit den Pushs anderer Entwickler zu vermeiden.

Techdreams
quelle
1
Glaubst du nicht, es ist besser, zuerst auf das -f zu verzichten? dann, wenn es Konflikte gibt, um zuerst zu bestätigen, dass es in Ordnung ist, darüber zu schreiben
nxmohamad
7

Bei mir funktioniert es,

git push -f heroku otherBranch:master

Das -f (Force-Flag) wird empfohlen, um Konflikte mit den Pushs anderer Entwickler zu vermeiden. Da Sie Git nicht für Ihre Revisionskontrolle verwenden, sondern nur als Transportmittel, ist die Verwendung des Force-Flags eine vernünftige Vorgehensweise.

Quelle: - offizielle Dokumente

Ashad Nasim
quelle
5

Beachten Sie auch, dass bei Verwendung des Git-Flow-Systems und Ihres Feature-Zweigs möglicherweise aufgerufen wird

feature/mobile_additions

und mit einer git-fernbedienung namens stagingtwo wäre der befehl, auf heroku zu drücken

git push stagingtwo feature/mobile_additions:master
Jonathon Batson
quelle
4

Sie sollten sich heroku_san ansehen , es löst dieses Problem ganz gut.

Zum Beispiel könnten Sie:

git checkout BRANCH
rake qa deploy

Es macht es auch einfach, neue Heroku-Instanzen zu starten, um einen Themenzweig auf neuen Servern bereitzustellen:

git checkout BRANCH
# edit config/heroku.yml with new app instance and shortname
rake shortname heroku:create deploy # auto creates deploys and migrates

Und natürlich können Sie einfachere Rechenaufgaben erledigen, wenn Sie häufig etwas tun.

jqr
quelle
0

Ich denke es sollte sein

push = refs/heads/*:refs/heads/*

stattdessen...

Ken
quelle