Werden Git-Tags auch gepusht?

188

Seit ich mein Repository erstellt habe, werden die von mir erstellten Tags anscheinend nicht in das Repository verschoben. Wenn ich mich git tagim lokalen Verzeichnis befinde, sind alle Tags vorhanden, aber wenn ich mich beim Remote-Repository anmelde und a mache git tag, werden nur die ersten angezeigt.

Was könnte das Problem sein?

vfclists
quelle
3
git push --follow-tagskann jetzt nützlich sein, siehe meine Antwort unten
VonC
1
Stimmen Sie dem Duplikat zu: Obwohl dies älter ist, ist die andere Frage besser gestellt.
Ciro Santilli 法轮功 冠状 病 六四 事件 18

Antworten:

244

Sie könnten dies tun:

git push --tags
Eevar
quelle
27
Ich bin mir ziemlich sicher, dass dies bedeutet, dass die HEAD-Refs nicht gepusht werden, was bedeutet, dass Sie NUR die Tags pushen.
Dan Rosenstark
47
"Ich empfehle, andere nicht zu verwenden oder zu schulen, git push --tagsda es sehr, sehr schwierig sein kann, schlechte Tags loszuwerden, wenn Ihre Mitarbeiter darin geschult sind, alle Tags zu pushen, da die Leute weiterhin jedes Mal die alten schlechten Tags pushen, die sie lokal haben Ich möchte einen neuen Tag pushen. Aus diesem Grund werde ich nur jedem raten, ihn git push origin <tag_name>jetzt zu verwenden . " - kopiert von stackoverflow.com/a/5195913/4130619
Reduzierung der Aktivität
Ich denke, die andere Antwort, stackoverflow.com/a/16164809/11635, sollte akzeptiert werden. Auch wenn nicht, sollte es unbedingt gelesen werden - es bietet Vor- und Nachteile und letztendlich eine praktischere und korrektere Antwort für heute
Ruben Bartelink
138

In der Standardkonfiguration von git remote müssen Sie Tags explizit pushen (während sie automatisch zusammen mit Commits abgerufen werden, auf die sie verweisen). Sie müssen verwenden

$ git push <remote> tag <tagname>

um ein einzelnes Tag zu pushen, oder

$ git push <remote> --tags

um alle Tags zu pushen (oder git push --tagsum normalerweise auf die Standardfernbedienung zu pushen origin).

Dies ist ein sehr beabsichtigtes Verhalten, um Push-Tags explizit zu machen. Das Schieben von Tags sollte normalerweise eine bewusste Wahl sein.


Zusammenfassend, was Junio ​​C. Hamano geschrieben hat (verlinkt in Kommentaren von @Andre Miras)

Beim Abrufen interagieren Sie mit einem Remote-Repository, das jemand veröffentlicht hat. Dies bedeutet:

  1. Die dort vorhandenen Tags sind alle, die der Herausgeber sehen wollte, und
  2. Nicht nur Sie, sondern auch andere Personen sehen dieselben Tags.

Mit anderen Worten, Tags in Repositorys, aus denen Sie abrufen, sind öffentlich und freigegeben. Es erleichtert die Kommunikation zwischen Entwicklern, wenn es für alle einfach ist, dieselben Tags abzurufen.

Aus diesem Grund git fetch"folgt" Tags automatisch Tags, dh es werden Tags heruntergeladen, wenn Revisionen heruntergeladen werden, auf die sie verweisen - mit anderen Worten, alle relevanten veröffentlichten Tags werden heruntergeladen .

Beim Pushing pushen Sie aus Ihrem Arbeits-Repository, das die meiste Zeit nicht öffentlich ist, und Tags in diesem Repository sind nicht als öffentlich konzipiert. Sie können Ihre eigenen lokalen Tags verwenden, um Ihren Fortschritt zu markieren. Daher ist es nicht sinnvoll, alle Tags in Ihrem Repository blind in das Repository zu verschieben, in das Sie Ihre Änderungen veröffentlichen, deren Tags per Definition öffentlich sind.

Aus diesem Grund müssen Sie das Tag explizit drücken, um das Tag als öffentlich zu markieren.


Alternativ können Sie die Konfiguration Remote drücken Sie immer alle Tags zu schieben, zB Put etwas wie das in Ihrer .git/config:

[remote "veröffentlichen"] # oder wie auch immer es heißt
    url = ...
    push = + refs / Heads / *: Refs / Heads / *
    push = + refs / tags / *: refs / tags / *

Dies bedeutet , dass alle Köpfe (alle Zweige) und alle Tags erzwungen werden müssen (wenn Sie nicht möchten, dass die Köpfe erzwungen werden, entfernen Sie das Präfix '+' aus refspec).

Jakub Narębski
quelle
Macht das nicht immer einen "Kraftstoß" aller Köpfe?
Stefan Näwe
@ Stefan: Ja, das tut es. Aktualisiert.
Jakub Narębski
19
"Dies ist ein sehr beabsichtigtes Verhalten, um das Drücken von Tags explizit zu machen. Das Drücken von Tags sollte normalerweise eine bewusste Entscheidung sein." Ich verstehe die Gründe nicht. Können Sie erläutern, warum es für Git schlecht wäre, Tags automatisch zu pushen?
Ryan Lundy
13
@Kyralessa, in diesem Beitrag git.661346.n2.nabble.com/… erklärt Junio ​​C Hamano (aktueller Betreuer von Git), warum es schlecht ist, Tags automatisch zu pushen.
Andre Miras
@AndreMiras Danke für diesen tollen Link. Es wäre schön, wenn wir Junios Beitrag in diese Antwort integrieren könnten.
Homer6
67

Beachten Sie, dass Sie seit Git 1.8.3 (22. April 2013) nicht mehr zwei Befehle ausführen müssen, um Zweige und dann Tags zu verschieben:

Die neue --follow-tagsOption " " weist " git push" an , relevante mit Anmerkungen versehene Tags zu verschieben, wenn Zweige herausgeschoben werden .

Sie können jetzt versuchen, wenn Sie neue Commits pushen:

git push --follow-tags

Dadurch werden jedoch nicht alle lokalen Tags gepusht, sondern nur die mit Anmerkungen versehenen Tags, auf die durch Commits verwiesen wird, die mit dem gepusht werden git push.


Dies wurde in Commit c2aba15 von Junio ​​C Hamano ( gitster) eingeführt :

Die neue Option " --follow-tags" weist " git push" an, kommentierte Tags zu pushen, die auf der anderen Seite fehlen und die durch den Verlauf erreicht werden können, der ansonsten herausgeschoben wird.

Wenn Sie beispielsweise den Push " simple", " current" oder " upstream" verwenden, pushen Sie normalerweise den Verlauf, der zum Commit führt, zu Ihrem aktuellen Zeitpunkt HEADund sonst nichts.
Mit dieser Option würden Sie auch alle mit Anmerkungen versehenen Tags, die von diesem Commit aus erreichbar sind, auf die andere Seite verschieben.


Die Konfiguration push.followTagserlaubt --follow-tagsstandardmäßig das Einschließen (Git 2.4.1+, Q2 2015). Siehe " Push-Git-Commits und -Tags gleichzeitig ".

VonC
quelle
3
Dadurch werden nur alle mit Anmerkungen versehenen Tags verschoben. Die meisten Personen / Projekte verwenden Lightweight- Tags. Also in den meisten Fällen git push --follow-tagsnicht mehr alsgit push
Jarl
3
@ Jarl ja, ich habe in meiner Antwort "kommentiert" erwähnt. Aber ich habe wirklich nur kommentierte Tags verwendet und leichte Tags für den rein internen Gebrauch reserviert (dh sowieso nie dazu gedacht, gepusht zu werden).
VonC
@VonC: Jetzt gibt es auch eine Konfigurationsoption, die dies zum Standard macht, wie Sie hier notiert haben: stackoverflow.com/a/3745250/946850
krlmlr
19

Was ich normalerweise mache ist:

[remote "veröffentlichen"] # oder wie auch immer es heißt
    url = ...
    push =:
    push = + refs / tags / *: refs / tags / *

Das heißt, es werden alle bereits vorhandenen Zweige sowie Tags gepusht. Es erzwingt kein Drücken und es drückt keinen Zweig, den Sie nicht manuell gedrückt haben.

Matte
quelle
Kann ich das auch in die globale Git-Konfiguration meines Benutzers einfügen? Wenn ja, wie? Vielen Dank! :)
gucki
Es sieht so aus, als würden Sie die Tags erzwingen, aber nicht die Zweige.
Adrian Ratnapala
Nun ja und nein, ich habe das geschrieben, es werden neue Tags gepusht, es werden sie nicht erzwungen und es werden keine Zweige gepusht, die Sie noch nicht selbst gepusht haben.
Matte
Ich habe Jakubs Vorschlag ausprobiert, aber er hat Zweige vorangetrieben, die ich nur vor Ort haben wollte. Dieser Vorschlag, Matte, funktioniert perfekt. Es synchronisiert Tags, synchronisiert jedoch keine Zweige, es sei denn, es handelt sich um Fernverfolgungszweige (dh es werden keine neuen Zweige auf die Fernbedienung übertragen, sondern aktualisiert, wenn sie sich bereits in der Fernbedienung befinden). HINWEIS: Wenn Sie ein Tag und einen Zweig mit demselben Namen haben, wird der Fehler "Übereinstimmungen mit mehr als einem" angezeigt. Siehe lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
Josephdpurcell
5

Wenn Sie das Abrufen aller Tags erzwingen möchten, können Sie dies in der Konfiguration festlegen, indem Sie:

git config remote.origin.tagopt --tags

Aus den Dokumenten:

Wenn Sie diesen Wert auf --no-tags setzen, wird die automatische Tag-Verfolgung beim Abrufen von der Fernbedienung deaktiviert. Wenn Sie den Wert auf --tags setzen, wird jedes Tag von der Fernbedienung abgerufen, auch wenn es von den Fernzweigköpfen nicht erreichbar ist. Wenn Sie diese Flags direkt an git-fetch (1) übergeben, kann diese Einstellung überschrieben werden. Siehe Optionen --tags und --no-tags von git-fetch (1).

Boryn
quelle
1
Die Frage war eher auf Push ausgerichtet. Gilt Ihre Antwort auch für das Drücken auf eine Fernbedienung?
a1an