Wie kann ein Git-Tag mithilfe einer Referenzspezifikation in einen Zweig verschoben werden?

216

Ich möchte beispielsweise das Drücken meines Tags 1.0.0auf meinen Remote- masterZweig erzwingen .

Ich mache jetzt folgendes:

git push production +1.0.0:master

Ich möchte den Push erzwingen , da mir nur wichtig ist, dass der Code im1.0.0Tag in denmasterZweig des Remote-Repositorys verschoben wird.

Was mache ich falsch?

Update Nr. 1

Wenn ich SSH auf meinem Server verwende, auf dem sich mein Git- Repository befindet, und ausgeführt werde git branch -l, wird der masterZweig auch nicht aufgelistet.

Update Nr. 2

Nachdem git tag -lich aus dem Remote-Git-Repository ausgeführt habe, masterwird diese aufgelistet. Dies bedeutet, dass ich Folgendes ausgeführt habe:

git push production 1.0.0:master

Es hat das Tag tatsächlich verschoben und ein Tag mit dem Namen master anstelle eines neuen Zweigs erstellt .

Ich möchte den Inhalt des Tags grundsätzlich 1.0.0in den masterZweig des Remote-Git-Repositorys verschieben.

Michael van Rooijen
quelle
Können Sie klarstellen, was "nicht funktioniert" bedeutet? Gibt Git einen bestimmten Fehler aus oder hat es einen Null-Effekt?
vcsjones
Es tut mir Leid. Ja, wenn ich also SSH in meinen Server, in das Git-Repository und Git-Zweig -l starte, um die Zweige aufzulisten , sehe ich nur meinen anderen Zweig. Allerdings hat die Git-Push-Produktion +1.0.0: Master gepusht , und wenn ich sie erneut drücke , wird " Alles auf dem neuesten Stand" angezeigt , aber ich sehe den Master-Zweig auf dem Remote-Server nicht.
Michael van Rooijen
5
Sie sollten die akzeptierte Antwort ändern. Die zweite Antwort ist viel einfacher als die als akzeptiert gekennzeichnete.
Pedro Rolo
Entschuldigung für die späte Antwort. Ich stimme zu und habe jetzt die akzeptierte Antwort geändert.
Michael van Rooijen
1
@MichaelvanRooijen Ich verstehe nicht, wie die von Ihnen gewählte akzeptierte Antwort dieses Problem tatsächlich löst. Es überschreibt keinen Zweig mit einem Tag, sondern schiebt Ihre Tags nur auf die Fernbedienung.

Antworten:

61

Es schlägt wahrscheinlich fehl, weil 1.0.0es sich um ein mit Anmerkungen versehenes Tag handelt. Möglicherweise haben Sie die folgende Fehlermeldung gesehen:

Fehler: Es wurde versucht, ein nicht festgeschriebenes Objekt in die Verzweigungsreferenzen / Köpfe / Master zu schreiben

Mit Anmerkungen versehene Tags haben einen eigenen Objekttyp, der auf das mit Tags versehene Festschreibungsobjekt verweist. Zweige können nicht sinnvoll auf Tag-Objekte verweisen, sondern nur Objekte festschreiben. Sie müssen das mit Anmerkungen versehene Tag zurückschälen, um das Objekt festzuschreiben, und es stattdessen verschieben.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Es gibt eine andere Syntax, die auch in diesem Fall funktionieren würde, aber sie bedeutet etwas anderes, wenn das Tag-Objekt auf etwas anderes als ein Commit zeigt (oder auf ein Tag-Objekt, das auf ein Commit zeigt (ein Tag-Objekt, das auf ein… zeigt). .

git push production +1.0.0^{}:master

Diese Tag-Peeling-Syntaxen werden in git-rev-parse (1) unter Spezifizieren von Revisionen beschrieben .

Chris Johnsen
quelle
1
Dies löste das Problem! Doch der Hauptzweig muss bereits existieren. Dies ist jedoch kein Problem für mich. Vielen dank für Deine Hilfe!
Michael van Rooijen
2
@ Michael: Ahh. Ja, wenn der Master nicht vorhanden ist (als Zweig oder Tag), git push rep +tag:masterwird anstelle eines Zweigs ein Tag mit dem Namen master erstellt . git push rep +tag~0:master(erneut, wenn der Master nicht als Zweig oder Tag vorhanden ist) schlägt mit "Fehler: Pushing nicht zum nicht qualifizierten Ziel" fehl. Der Befehl, der getan hätte , was man (vor jeder wollte Master Zweig / Tag existierte) ist git push rep +tag~0:refs/heads/master( refs/heads/ist der Namespace , unter denen Zweige gespeichert werden).
Chris Johnsen
GROSSARTIG! Das wird mir erstaunlich gut helfen. Sehr angenehm! Vielen Dank, dass Sie diese Informationen ebenfalls veröffentlicht haben.
Michael van Rooijen
4
@brad: Die ~{commit}Syntax ist wörtlich (dh immer diese neun Zeichen); Das Wort commitist hier kein Platzhalter.
Chris Johnsen
1
ah ok! Entschuldigung, ich dachte, Sie wollten das bestimmte Commit eingeben, macht jetzt mehr Sinn.
Brad
469
git push --tags production
bstpierre
quelle
4
Wenn das Tag bereits auf der Fernbedienung vorhanden ist, müssen Sie das Remote-Tag zuerst mit löschen git push production :1.0.0.
Respektieren Sie den Code
1
Wenn Sie zu irgendeinem Zeitpunkt einen Zweig mit demselben Namen haben: '1.0.0', schlägt dieser Push fehl. Verwenden Sie ihn daher besser: git push production :refs/tags/1.0.0um nur das Tag zu löschen
Vladimir
1
@Nerian: Ich denke, es drückt nur Tags
bstpierre
5
Wie löst dies tatsächlich das Problem des Originalplakats, einen Zweig mit einem Tag zu überschreiben, indem man ihn zwangsweise drückt? Dadurch werden nur alle Ihre Tags auf eine Fernbedienung übertragen, und es werden keine Zweige überschrieben.
1
Ist die Frage nicht, wie man ein Tag pusht? Dieser Befehl macht noch viel mehr.
Chris Martin
61

Ich erstelle das Tag so und schiebe es dann an GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To [email protected]:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1
neoneye
quelle
4
es schieben alle Ihre Tags
Dawid Drozd
2
Beachten Sie, dass dies das Problem des Originalplakats beim Überschreiben eines Zweigs mit einem Tag nicht wirklich löst, sondern lediglich Ihre Tags auf eine Fernbedienung überträgt, ohne die Zweige zu beeinflussen.
10

Zum Verschieben eines einzelnen Tags: git push <reponame> <tagname>

Zum Beispiel git push production 1.0.0. Tags sind nicht an Zweige gebunden, sondern an Commits.

Wenn Sie den Inhalt des Tags im Hauptzweig haben möchten, tun Sie dies lokal auf Ihrem Computer. Ich würde davon ausgehen, dass Sie sich in Ihrer lokalen Hauptniederlassung weiterentwickelt haben. Dann sollte nur ein git push origin masterausreichen.

koppor
quelle
5
Beachten Sie, dass dies das Problem des Originalplakats beim Überschreiben eines Zweigs mit einem Tag nicht wirklich löst, sondern lediglich Ihre Tags auf eine Fernbedienung überträgt, ohne die Zweige zu beeinflussen.