Laden Sie ein bestimmtes Tag mit Git herunter


1941

Ich versuche herauszufinden, wie ich ein bestimmtes Tag eines Git-Repositorys herunterladen kann - es ist eine Version hinter der aktuellen Version.

Ich habe gesehen, dass es auf der Git-Webseite ein Tag für die vorherige Version mit dem Objektnamen einer langen Hex-Nummer gibt.

Der Versionsname lautet jedoch Tagged release 1.1.5laut Site " ".

Ich habe einen Befehl wie diesen versucht (mit geänderten Namen):

git clone http://git.abc.net/git/abc.git my_abc

Und ich habe etwas bekommen - ein Verzeichnis, eine Reihe von Unterverzeichnissen usw.

Wie komme ich zu der gesuchten Version, wenn es sich um das gesamte Repository handelt? Wenn nicht, wie lade ich diese bestimmte Version herunter?


11
Ich entwickle auf einem völlig anderen Repo als die Produktion, daher kannte meine Produktion keine Tags, als ich versuchte, Git Checkout zu verwenden. Die Lösung bestand darin, "git pull --tags" zu verwenden und dann git checkout zu verwenden.
Enterprise Architect

11
"git fetch --tags" funktioniert auch
John Erck

16
Um zu vermeiden, dass das gesamte Repository geklont und dann zu einem Tag gewechselt wird, können Sie direkt a clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc. Dies funktioniert natürlich nur, wenn Sie keinen Zweig mit demselben Namen haben (abhängig von Ihrer Methodik kann dies niemals passieren).
RedGlyph

3
@ RedGlyph Danke, ich werde es versuchen. Sonst können wir das so machen. git checkout -b new-branch tag-name. Klonen Sie jetzt Ihren neuen Zweig. Wann immer wir wollen, können wir den neuen Zweig löschen.
Kalidasan

Antworten:


2871
$ git clone

gibt Ihnen das gesamte Repository.

Nach dem Klonen können Sie die Tags auflisten $ git tag -lund dann ein bestimmtes Tag auschecken:

$ git checkout tags/<tag_name>

Noch besser, checken Sie aus und erstellen Sie einen Zweig (andernfalls befinden Sie sich in einem Zweig, der nach der Revisionsnummer des Tags benannt ist):

$ git checkout tags/<tag_name> -b <branch_name>

15
Ja. Git unterscheidet sich in dieser Hinsicht von Subversion. Ein svn-Tag kopiert die Dateien grundsätzlich in einen neuen Ordner, sodass Sie eine bestimmte Reihe von Dateien svn auschecken können, während git-Tags lediglich Zeiger auf bestimmte Revisionen sind.
dbr

5
Was ist, wenn Sie einen Zweig und ein Tag mit demselben Namen haben? Wenn Sie nur "git checkout <Name>" sagen, heißt es "Warnung: Refname '<Name>' ist nicht eindeutig. In Zweig '<Name>' gewechselt" - wie können Sie ihn anweisen, stattdessen zum Tag zu wechseln?
MatrixFrog

54
Beim Auschecken und wie Derek erwähnt hat, geht das Repo in den Zustand "losgelöst". -bgit checkout <tag_name> -b <branch_name>
Fügen Sie

22
@hellatan Das solltest du nur tun, wenn du tatsächlich einen Zweig erstellen willst, aber meistens wahrscheinlich nicht. Das Laufen im Zustand "losgelöster Kopf" schadet Ihnen nicht und ist wahrscheinlich genau das, was Sie wollen, wenn Sie nur einen Git-Verlauf überprüfen möchten.
Machineghost

4
In der Git-Version 1.8.3.5und neueren Versionen --branch <tag ref>sollte es Ihnen möglich sein, das Repository ab Ihrem <tag ref>als Repo-HEAD herunterzuladen . kombiniert mit --depth 1wird eine flache Tag-Kasse durchgeführt. Siehe stackoverflow.com/a/21699307/1695680
ThorSummoner

409
git clone --branch my_abc http://git.abc.net/git/abc.git

Klont das Repo und lässt Sie auf dem Tag, an dem Sie interessiert sind.

Dokumentation für 1.8.0 der Git-Klonzustände .

--branch kann auch Tags verwenden und den HEAD bei diesem Commit im resultierenden Repository trennen.


7
Dies funktioniert (zumindest jetzt) ​​für Tags, obwohl Sie sich in einem getrennten HEAD-Status befinden.
mxcl

72
Zu Ihrer Information: Geben Sie außerdem an --depth 1, um das Herunterladen nicht aktueller Commits zu vermeiden.
Acumenus

4
Dies funktioniert in der Tat nicht mit Tags. Nur Zweige. Bearbeiten: Es sieht so aus, als ob nur neuere Versionen von Git dies unterstützen.
lzap

Wir können auch .git / config bearbeiten (oder es irgendwie konfigurieren), um einen flachen Klon mit zwei oder mehr Tags zu erstellen. Wenn dies erforderlich sein könnte, aktualisieren Sie einen flachen Klon auf einen vollständigen Klon usw.
Sam Watkins

Sie können auch den gewünschten Zweig zusammen mit dem Tag angeben. Wie git clone --branch my_abc http://git.abc.net/git/abc.git -b qualityQualität ist der Name der Branche, die wir übrigens wollen.
Hazimdikenli

180

Zum Auschecken nur eines bestimmten Tags für die Bereitstellung verwende ich z.

git clone -b 'v2.0' --single-branch --depth 1 https://github.com/git/git.git

Dies scheint der schnellste Weg zu sein, um Code aus einem Remote-Repository auszuchecken, wenn man sich nur für den neuesten Code anstatt für ein vollständiges Repository interessiert. Auf diese Weise ähnelt es dem Befehl 'svn co'.

Hinweis: Gemäß dem Git-Handbuch bedeutet das Übergeben des --depthFlags --single-branchstandardmäßig.

--Tiefe

Erstellen Sie einen flachen Klon mit einem Verlauf, der auf die angegebene Anzahl von Commits abgeschnitten ist. Impliziert --single-branch, es sei denn, --no-single-branch wird angegeben, um die Historien in der Nähe der Spitzen aller Zweige abzurufen. Wenn Sie Submodule flach klonen möchten, übergeben Sie auch --shallow-Submodule.


10
Ich kann nicht glauben, dass es so kompliziert ist. Vermutlich erwartet niemand, dass ihr Code von anderen verwendet wird.
Ben

9
@ Ben, dies ist eigentlich die einfachste Lösung (ein einziger Befehl ist erforderlich)
Eliran Malka

3
@ Ben warum ist das kompliziert? Es ist ein spezieller Anwendungsfall mit einigen Funktionen, die Sie anders als die Standardfunktionen ausführen möchten. Natürlich müssen Sie es angeben. Die normale Lösung wäre, das gesamte Repo in einem verteilten VCS auszuchecken.
Erikbwork

9
@ Ben ist richtig. git ist kompliziert und wurde vor JAHREN von Linus geschrieben und er ist der einzige, der "wirklich" versteht, wie es funktioniert. xkcd.com/1597
RyanNerd

11
--depth nimpliziert --single-branch. Du brauchst nicht beides.
Niyaz

98

Ich bin kein Git-Experte, aber ich denke, das sollte funktionieren:

git clone http://git.abc.net/git/abc.git
cd abc
git checkout my_abc 

ODER

git clone http://git.abc.net/git/abc.git
cd abc
git checkout -b new_branch my_abc

Die zweite Variante erstellt einen neuen Zweig basierend auf dem Tag, mit dem Sie einen "abgetrennten KOPF" vermeiden können. (Git-Checkout-Handbuch)

Jedes Git-Repo enthält den gesamten Revisionsverlauf. Wenn Sie also das Repo klonen, erhalten Sie Zugriff auf das neueste Commit sowie auf alle vorherigen Vorgänge, einschließlich des gesuchten Tags.


4
Danke. Ich musste git checkout -b b1.5.0 v1.5.0beim Auschecken einer Version in einem 'gh-pages'-Zweig verwenden, um erfolgreich auf Github Pages zu pushen. Dieses Gist, das ich geschrieben habe, könnte anderen helfen: branch / tag / submodules ... gist.github.com/1064750
Chris Jacob

4
Ich glaube nicht , das völlig korrekt ist (zum Beispiel in Terminal einfügen) , da du musst cdin abc/zuerst , bevor Sie eine Filiale Prüfung können
Steven Lu

@StevenLu Du bist natürlich richtig. Ich habe mich eher für Konzepte als für Ausschneiden und Einfügen entschieden, aber es könnte genauso gut so genau wie möglich sein. Ich habe das hinzugefügt cd.
Grossvogel

81

Sie können das Git-Archiv verwenden, um einen Teerball für ein bestimmtes Tag oder eine bestimmte Commit-ID herunterzuladen:

git archive --format=tar --remote=[hostname]:[path to repo] [tag name] > tagged_version.tar

Sie können auch ein Zip-Archiv eines Tags exportieren.

  1. Listen-Tags:

    git tag
    
    0.0.1
    0.1.0
    
  2. Exportieren Sie ein Tag:

    git archive -o /tmp/my-repo-0.1.0.zip --prefix=my-repo-0.1.0/ 0.1.0
    
  3. Anmerkungen:

    • Sie müssen das Format nicht angeben. Es wird vom Namen der Ausgabedatei erfasst.
    • Wenn Sie das Präfix angeben, wird Ihr Code in ein Verzeichnis exportiert (wenn Sie einen abschließenden Schrägstrich einfügen).

3
Dieser Befehl funktioniert nicht mit Submodulen, siehe stackoverflow.com/questions/1591387/…
Zitrax

3
Das Git-Archiv entfernt jedoch auch die Versionskontrolle, sodass Sie nicht einfach eine weitere Git-Prüfung durchführen können, um auf das nächste Tag zu aktualisieren.
idbrii

9
Ja, Sie verlieren die Versionskontrolle, aber die Zeit, die das Git-Archiv im Vergleich zum Git-Klon spart, ist ABSOLUT UNGLAUBLICH! +1
MarcH

Dies ist so nah an dem, was ich will, außer dass git archiveich nach einem Passwort gefragt werde, wenn ich nur von einem öffentlichen Repo herunterladen möchte. Wie kann ich dafür sorgen, dass http anstelle von ssh verwendet wird?
Robru

1
Dies schlägt mit den fatal: Operation not supported by protocol.und Unexpected end of command streamFehlern fehl . Alternativ kann der fatal: The remote end hung up unexpectedlyFehler auch zurückgegeben werden.
Acumenus

52

Verwenden Sie den --single-branchSchalter (verfügbar ab Git 1.7.10) . Die Syntax lautet:

git clone -b <tag_name> --single-branch <repo_url> [<dest_dir>] 

Zum Beispiel:

git clone -b 'v1.9.5' --single-branch https://github.com/git/git.git git-1.9.5

Der Vorteil: Git empfängt Objekte und (muss) Deltas nur für den angegebenen Zweig / Tag auflösen - während genau die gleiche Anzahl von Dateien ausgecheckt wird! Je nach Quell-Repository sparen Sie dadurch viel Speicherplatz. (Außerdem wird es viel schneller gehen.)


3
Wer diese Antwort abgelehnt / abgelehnt hat: Bitte hinterlassen Sie auch einen Kommentar mit einer kurzen Erklärung für die Ablehnung. (Ich frage nur, weil ich ein bisschen verwirrt bin. Weil dies die beste Lösung für das gegebene Problem ist. Und wenn Sie das nicht glauben, würde ich gerne wissen warum.) Vielen Dank.
eyecatchUp

5
Versuchen Sie nicht, zu viel Sinn für die Downvotes zu machen. Ihre Antwort ist sehr gut. Ihre Downvotes sind wahrscheinlich unbegründet. Das ist das Leben auf SOF.
Javadba

funktionierte nicht auf Git Version 2.22.0.windows.1
Mahesh

29

Rufen Sie zuerst alle Tags in dieser bestimmten Fernbedienung ab

git fetch <remote> 'refs/tags/*:refs/tags/*'

oder einfach eingeben

git fetch <remote>

Überprüfen Sie dann die verfügbaren Tags

git tag -l

Wechseln Sie dann mit dem folgenden Befehl zu diesem bestimmten Tag

git checkout tags/<tag_name>

Hoffe das wird dir helfen!


Warum sollte ´git tag -l´ verwendet werden, es sollte dasselbe sein wie ´git tag´?
Serup

1
@serup; git tagfügt ein Tag hinzu, während git tag -ldie verfügbaren Tags
aufgelistet werden

18

Wenn Ihre Tags mit dem Linux- sortBefehl sortiert werden können , verwenden Sie Folgendes :

git tag | sort -n | tail -1

z.B. if gibt git tagzurück:

v1.0.1
v1.0.2
v1.0.5
v1.0.4

git tag | sort -n | tail -1 wird ausgegeben:

v1.0.5

git tag | sort -n | tail -2 | head -1 wird ausgegeben:

v1.0.4

(weil Sie nach dem zweitletzten Tag gefragt haben)

Um das Tag auszuchecken, klonen Sie zuerst das Repo und geben Sie dann Folgendes ein:

git checkout v1.0.4

..oder was auch immer Sie brauchen.


25
Bis Sie v1.0.10 erreichen und dann schlimme Dinge passieren :)
Laurent Grégoire

10
Um Ihre Tags chronologisch sortieren zu lassen:git for-each-ref --sort='*authordate' --format='%(tag)' refs/tags
Bob G

git checkout `git tag | sort -n | tail -1`
Einzeiler

Vielleicht möchten Sie sort -Vstatt verwenden sort -n. Ersteres behandelt Versionen, die nicht unbedingt numerisch sind, z. B. "1.2.3", korrekt. Es versteht sich auch, dass "0.4.10" nach "0.4.1" und nicht nach "0.4.2" geht, was -nIhnen geben wird.
Mateusz Misiorny

16

Ich habe die Dokumentation zum Auschecken von Git überprüft und dabei eine interessante Sache entdeckt:

git checkout -b <new_branch_name> <start_point>, wobei <start_point> der Name eines Commits ist, bei dem der neue Zweig gestartet werden soll; Der Standardwert ist HEAD

Wir können also den Tag-Namen (da Tag nichts anderes als ein Name eines Commits ist) wie folgt erwähnen:

>> git checkout -b 1.0.2_branch 1.0.2
später einige Dateien ändern
>> git push --tags

PS: In Git können Sie ein Tag nicht direkt aktualisieren (da das Tag nur eine Bezeichnung für ein Commit ist). Sie müssen dasselbe Tag wie ein Zweig auschecken, es dann festschreiben und dann ein separates Tag erstellen.


1
Wenn Sie keine Änderungen erwarten und nur sehen möchten, wie der Code in diesem Tag aussieht, können Sie das Tag einfach auschecken, ohne einen Zweig zu erstellen. Sie erhalten einen Text, in dem erklärt wird, dass Sie sich im Status "Abgelöster Kopf" befinden, und Sie können den Zweig später jederzeit erstellen, wenn Sie möchten.
MatrixFrog

16
git fetch <gitserver> <remotetag>:<localtag>

===================================

Ich habe das gerade gemacht. Zuerst stellte ich sicher, dass ich die Schreibweise des Tag-Namens kannte.

git ls-remote --tags gitserver; : or origin, whatever your remote is called

Dies gab mir eine Liste von Tags auf meinem Git-Server zur Auswahl. Das Originalplakat kannte bereits den Namen seines Tags, sodass dieser Schritt nicht für alle erforderlich ist. Die Ausgabe sah so aus, obwohl die reale Liste länger war.

8acb6864d10caa9baf25cc1e4857371efb01f7cd    refs/tags/v5.2.2.2
f4ba9d79e3d760f1990c2117187b5010e92e1ea2    refs/tags/v5.2.3.1
8dd05466201b51fcaf4ca85897347d82fcb29518    refs/tags/Fix_109
9b5087090d9077c10ba22d99d5ce90d8a45c50a3    refs/tags/Fix_110

Ich wählte das Tag, das ich wollte, und holte es und nichts weiter wie folgt.

git fetch gitserver Fix_110

Ich habe dies dann auf meinem lokalen Computer markiert und meinem Tag den gleichen Namen gegeben.

git tag Fix_110 FETCH_HEAD

Ich wollte das Remote-Repository nicht klonen, wie andere vorgeschlagen haben, da das Projekt, an dem ich arbeite, groß ist und ich es in einer schönen, sauberen Umgebung entwickeln möchte. Ich bin der Meinung, dass dies näher an den ursprünglichen Fragen "Ich versuche herauszufinden, wie man einen bestimmten Tag herunterlädt" liegt als an der Lösung, die das Klonen des gesamten Repositorys vorschlägt. Ich verstehe nicht, warum jemand eine Kopie des Windows NT- und Windows 8.1-Quellcodes benötigen sollte, wenn er sich beispielsweise den DOS 0.1-Quellcode ansehen möchte.

Ich wollte CHECKOUT auch nicht verwenden, wie andere vorgeschlagen haben. Ich hatte eine Filiale ausgecheckt und wollte das nicht beeinflussen. Meine Absicht war es, die Software zu holen, die ich wollte, damit ich etwas auswählen und das zu meiner Entwicklung hinzufügen konnte.

Es gibt wahrscheinlich eine Möglichkeit, das Tag selbst abzurufen, anstatt nur eine Kopie des Commits, das markiert wurde. Ich musste das abgerufene Commit selbst markieren. EDIT: Ah ja, ich habe es jetzt gefunden.

git fetch gitserver Fix_110:Fix_110

Wo Sie den Doppelpunkt sehen, ist das Remote-Name: lokaler Name und hier sind sie die Tag-Namen. Dies läuft, ohne den Arbeitsbaum usw. zu stören. Es scheint nur Dinge von der Fernbedienung auf den lokalen Computer zu kopieren, sodass Sie Ihre eigene Kopie haben.

git fetch gitserver --dry-run Fix_110:Fix_110

Mit der hinzugefügten Option --dry-run können Sie sehen, was der Befehl tun würde, wenn Sie überprüfen möchten, was Sie möchten. Also ich denke ein einfaches

git fetch gitserver remotetag:localtag

ist die wahre Antwort.

=

Ein separater Hinweis zu Tags ... Wenn ich etwas Neues starte, tagge ich normalerweise das leere Repository nach git init, da

git rebase -i XXXXX 

erfordert ein Commit, und es stellt sich die Frage: "Wie können Sie Änderungen, die Ihre erste Softwareänderung beinhalten, neu begründen?" Wenn ich anfange zu arbeiten, tue ich das

git init
touch .gitignore
[then add it and commit it, and finally]
git tag EMPTY

dh erstelle ein Commit vor meiner ersten echten Änderung und verwende es später

git rebase -i EMPTY 

wenn ich meine gesamte Arbeit, einschließlich der ersten Änderung , neu definieren möchte .


8

Ausgehend von Peter Johnsons Antwort habe ich mir einen netten kleinen Alias ​​erstellt:

alias gcolt="git checkout $(git tag | sort -V | tail -1)"

aka 'Git Checkout neuesten Tag'.

Dies beruht auf der GNU-Version von sort, die Situationen wie die von lOranger angemessen behandelt:

v1.0.1
...
v1.0.9
v1.0.10

Wenn Sie einen Mac verwenden brew install coreutilsund stattdessen gsort aufrufen.


6

Versuchen:

git clone -b <name_of_the_tag> <repository_url> <destination>

Wenn es mehrere Zweige für das Repository gibt, welcher Zweig wird dann geklont?
tauseef_CuriousGuy

5

Tags auschecken

Wenn Sie die Versionen von Dateien anzeigen möchten, auf die ein Tag verweist, können Sie eine Git-Prüfung durchführen. Dadurch wird Ihr Repository jedoch in den Status "Separated HEAD" versetzt, was einige schwerwiegende Nebenwirkungen hat:

$ git checkout 2.0.0
Note: checking out '2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout 2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... add atlas.json and cover image

Wenn Sie im Status "Getrennter KOPF" Änderungen vornehmen und dann ein Commit erstellen, bleibt das Tag gleich, aber Ihr neues Commit gehört keinem Zweig an und ist nicht erreichbar, außer durch den genauen Commit-Hash. Wenn Sie also Änderungen vornehmen müssen, z. B. wenn Sie beispielsweise einen Fehler in einer älteren Version beheben, möchten Sie im Allgemeinen einen Zweig erstellen:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

Wenn Sie dies tun und ein Commit durchführen, unterscheidet sich Ihr Zweig der Version 2 geringfügig von Ihrem v2.0.0-Tag, da Ihre neuen Änderungen fortgesetzt werden. Seien Sie also vorsichtig.


4

Ich mache das über die Github-API:

curl -H "Authorization: token %(access_token)s" -sL -o /tmp/repo.tar.gz "http://api.github.com/repos/%(organisation)s/%(repo)s/tarball/%(tag)s" ;\
tar xfz /tmp/repo.tar.gz -C /tmp/repo --strip-components=1 ; \

1
Dies funktioniert für Zweige und Tags, jedoch nicht für den Head of Master, für den ein Tag erstellt werden muss. Imho ziemlich elegante Art, eine Version mit minimaler Größe zu erhalten.
J0hnG4lt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.