wake-up-neo.com

Rufen Sie ein einzelnes Tag aus dem Remote-Repository ab

Dieser Befehl ruft all tags ab:

git fetch Origin --tags

Dieser Befehl ruft ein bestimmtes Tag ab:

git fetch Origin refs/tags/1.0.0

Aber das lässt mich nicht tun:

git checkout tags/2.3.18

Wie kann ich ein einzelnes Tag abrufen und dann eine Prüfung durchführen?

10
aleclarson

git fetch Origin refs/tags/1.0.0

Dies schlägt fehl, da keine lokale Referenz geschrieben wird: Sie erhält den refs/tags/1.0.0 der Fernbedienung und alle dazugehörigen Tag-Objekte, Commits usw., die erforderlich sind. diese werden in FETCH_HEAD abgelegt (wie bei allen git fetch-Befehlen immer). und das ist es. Es erstellt niemals die Referenz refs/tags/1.0.0 im Repository von your, obwohl es alles hat, was es dafür benötigt.

So erstellen Sie ein solches Tag, falls es noch nicht vorhanden ist:

git fetch Origin refs/tags/1.0.0:refs/tags/1.0.0

Der Name auf der rechten Seite des Doppelpunkts ist der Name, den Git in Ihrem Repository verwendet. Sie können dieses Tag in einen Zweig mit dem Namen wacky umwandeln, indem Sie es refs/heads/wacky nennen. (Es gibt keinen Grund, dies zu tun. Ich beschreibe das nur zur Veranschaulichung.)

Dies ist ein nicht erzwungener Abruf. Wenn Sie also bereits haben a refs/tags/1.0.0 haben, lehnt Ihr Git Ihre Referenz ab. Wenn Sie ein vorhandenes 1.0.0-Tag überschreiben möchten, verwenden Sie:

git fetch Origin +refs/tags/1.0.0:refs/tags/1.0.0

Wenn Sie alle Tags mit oder ohne Überschreiben abrufen möchten:

git fetch Origin 'refs/tags/*:refs/tags/*'

mit oder ohne führendes Pluszeichen. (Hinweis: Die Anführungszeichen dienen nur zum Schutz des * von Ihrer Shell. Das Pluszeichen kann innerhalb oder außerhalb der Anführungszeichen stehen. Tatsächlich können die Anführungszeichen selbst beliebig sein, solange sie alle Sternchen oder andere Shell-Metazeichen enthalten:

refs/tags/'*:refs/tags/*'

oder Sie können stattdessen Backslashes verwenden:

refs/tags/\*:refs/tags/\*

In allen Fällen schützen wir nur das empfindliche Sternchen vor den Funktionen der Shell "Sternchen sind lecker, lassen Sie uns sie essen".)

21
torek

Wenn Sie explizite Verweise auf git fetch angeben, müssen Sie entweder in Ihrem refspec ein Mapping bereitstellen oder mit den abgerufenen IDs, die in FETCH_HEAD aufgezeichnet wurden, das tun, was Sie möchten.

Der Vorteil, dass der von No-Mapping bereitgestellte Fall keine Standardverarbeitung für die abgerufenen Refs durchführt, besteht darin, dass der durch No-Mapping bereitgestellte Fall keine Standardverarbeitung für die abgerufenen Refs durchführt. Sie könnten es schätzen

git fetch Origin v2.3.18
git tag v2.3.18 FETCH_HEAD    # ← git tag !$ FE<TAB>

wenn Sie wirklich nur das eine Tag in Ihrem lokalen Repo einrichten möchten und nicht wie viele Dutzende vorheriger Tags im Origin-Repo-Punkt in der abgerufenen Historie.

2
jthill

Ich habe alle Antworten gelesen, aber noch keinen syntaktischen Zucker erwähnt. Wenn Sie nur ein Tag als Tag abrufen möchten (zum späteren Auschecken), können Sie beispielsweise für refs/tags/2.3.18 schreiben:

git fetch Origin tag 2.3.18 --no-tags

Dies ist die Abkürzung für bereits erwähnte: 

git fetch Origin refs/tags/2.3.18:refs/tags/2.3.18 --no-tags

Natürlich dürfen Sie --no-tags nicht verwenden, wenn Sie andere Tags benötigen (entsprechend dem Standardverhalten) oder wenn Sie --no-tag bereits explizit im Befehl clone oder in der Option tagOpt config (man git-clone) festgelegt haben.

git fetch Origin tag 2.3.18
0
Olleg