webentwicklung-frage-antwort-db.com.de

Werden Git-Tags auch gepusht?

Seit ich mein Repository erstellt habe, scheint es, dass die Tags, die ich erstellt habe, nicht in das Repository verschoben werden. Wenn ich git tag im lokalen Verzeichnis sind alle Tags vorhanden, aber wenn ich mich beim Remote-Repository anmelde und einen git tag, nur die ersten erscheinen.

Was könnte das Problem sein?.

173
vfclists

Sie könnten dies tun:

git Push --tags
225
eevar

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

$ git Push <remote> tag <tagname>

um ein einzelnes Tag zu pushen, oder

$ git Push <remote> --tags

alle Tags pushen (oder git Push --tags to Push to Standardfernbedienung, normalerweise Origin).

Dies ist sehr beabsichtigt, um Push-Tags explizit zu machen. Das Verschieben von Tags sollte in der Regel eine bewusste Entscheidung sein.


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

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

  1. die Tags, die dort existieren, sind alle, die der Verlag sehen wollte, und
  2. nicht nur Sie, sondern auch andere Personen sehen dieselben Tags.

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

Deshalb git fetch "folgt" Tags automatisch, d. h. es lädt Tags herunter, wenn sie Revisionen herunterladen, auf die sie verweisen - mit anderen Worten, es werden alle relevanten veröffentlicht Tags heruntergeladen.

Beim Pushen wird von Ihrem Arbeitsrepository gepusht, das zumeist nicht öffentlich ist, und Tags in diesem Repository sind nicht öffentlich. Sie können Ihre eigenen lokalen Tags verwenden, um Ihren Fortschritt zu markieren. Daher ist es nicht sinnvoll, blind alle Tags in Ihrem Repository in das Repository zu verschieben, das Sie pushen, um Ihre Änderungen zu veröffentlichen, deren Tags per Definition öffentlich sind.

Aus diesem Grund müssen Sie das Tag explizit pushen, um es als öffentlich zu kennzeichnen.


Alternativ können Sie die Fernbedienung konfigurieren, an die Sie Push senden, um immer alle Tags zu senden, z. Gib so etwas in dein .git/config:

 [Remote "Publish"] # oder wie auch immer es heißt 
 url = ... 
 Push = + refs/heads/*: refs/heads /*
 Push = + refs/tags/*: refs/tags /*[.____]

Dies bedeutet force Alle Köpfe (alle Zweige) und alle Tags drücken (wenn Sie kein erzwungenes Drücken der Köpfe wünschen, entfernen Sie das Präfix '+' aus refspec).

134
Jakub Narębski

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 pushen:

Die neue Option "--follow-tags" Weist "git Push" An, relevante annotierte Tags beim Herausschieben von Zweigen zu verschieben.

Sie können jetzt beim Pushen neuer Commits Folgendes versuchen:

git Push --follow-tags

Damit werden die lokalen Tags jedoch nicht gepusht all , sondern nur die annotierten , auf die durch Commits verwiesen wird, die mit git Push.


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

Die neue Option "--follow-tags" Weist "git Push" An, kommentierte Tags zu pushen, die auf der anderen Seite fehlen und über den Verlauf erreichbar sind, der ansonsten pusht.

Wenn Sie beispielsweise den Push "simple", "current" oder "upstream" verwenden, würden Sie den Verlauf, der zum Festschreiben führt, normalerweise auf Ihren aktuellen Stand verschieben HEAD und sonst nichts.
Mit dieser Option würden Sie auch alle mit Anmerkungen versehenen Tags, die von diesem Commit erreicht werden können, auf die andere Seite übertragen.


Die Konfiguration Push.followTags Erlaubt standardmäßig das Einschließen von --follow-tags (Git 2.4.1+, Q2 2015). Siehe " git-Commits und -Tags gleichzeitig drücken "

59
VonC

Was ich normalerweise mache ist:

 [Remote "Publizieren"] # oder wie auch immer es heißt 
 url = ... 
 Push =: 
 Push = + refs/tags/*: refs /Stichworte/*

Dies bedeutet, dass jeder Zweig, der bereits vorhanden ist, plus Tags übertragen wird. Push wird nicht erzwungen, und Zweig, den Sie nicht manuell gepusht haben, wird nicht gepusht.

19
mat

Und wenn Sie das Abrufen aller Tags erzwingen möchten, können Sie dies in der Konfiguration folgendermaßen einstellen:

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 Remote deaktiviert. Wenn Sie --tags festlegen, werden alle Tags von Remote abgerufen, auch wenn sie von Remote-Zweigköpfen nicht erreichbar sind. Wenn Sie diese Flags direkt an git-fetch (1) übergeben, kann diese Einstellung außer Kraft gesetzt werden. Siehe Optionen --tags und --no-tags von git-fetch (1).

4
boryn