wake-up-neo.com

Laden Sie ein bestimmtes Tag mit Git herunter

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 ein Tag für die vorherige Version auf der Git-Webseite gibt, mit dem Objektnamen einer langen Hex-Nummer.

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

Ich habe einen Befehl wie diesen ausprobiert (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 erhalte ich die gesuchte Version, wenn es sich um das gesamte Repository handelt? Wenn nicht, wie lade ich diese bestimmte Version herunter?

1851
Jack BeNimble
$ git clone

gibt Ihnen das gesamte Repository.

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

$ git checkout tags/<tag_name>

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

$ git checkout tags/<tag_name> -b <branch_name>
2788
besen
git clone --branch my_abc http://git.abc.net/git/abc.git

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

Dokumentation für 1.8.0 von Git-Klon Staaten.

--branch kann auch Tags nehmen und das HEAD bei diesem Commit im resultierenden Repository entfernen.

371
Toni

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 interessiert, nicht für ein vollständiges Repository. Auf diese Weise ähnelt es dem Befehl 'svn co'.

Hinweis: Per das Git-Handbuch impliziert das Übergeben des Flags --depth standardmäßig --single-branch.

--Tiefe

Erstellen Sie einen flachen Klon mit einem Verlauf, der auf die angegebene Anzahl von Commits gekürzt 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-submodules.

147
Yuan HOng

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 

OR

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

Mit der zweiten Variante wird ein neuer Zweig basierend auf dem Tag erstellt, mit dem Sie einen "abgetrennten HEAD" 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 Elemente, einschließlich des gesuchten Tags.

97
grossvogel

Sie können das Git-Archiv verwenden, um einen Tar-Ball 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. Tags auflisten:

    git tag
    
    0.0.1
    0.1.0
    
  2. Ein Tag exportieren:

    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 der Code in ein Verzeichnis exportiert (wenn Sie einen abschließenden Schrägstrich einfügen).
79
Chris J

Verwenden Sie den Schalter --single-branch (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 erhält Objekte und (muss) Deltas nur für den angegebenen Zweig/Tag auflösen - während genau dieselbe Anzahl von Dateien ausgecheckt wird! Abhängig vom Quell-Repository sparen Sie dadurch viel Speicherplatz. (Außerdem geht es viel schneller.)

52
eyecatchUp

holen Sie sich zuerst alle Tags in dieser spezifischen Fernbedienung

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

oder einfach eintippen

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!

27
tk_

Wenn Ihre Tags mit dem Befehl linux sort sortiert werden können, verwenden Sie Folgendes:

git tag | sort -n | tail -1

z.B. wenn git tag zurückgibt:

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

git tag | sort -n | tail -1 gibt aus:

v1.0.5

git tag | sort -n | tail -2 | head -1 gibt aus:

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 Tag Sie brauchen.

17
Peter Johnson
git fetch <gitserver> <remotetag>:<localtag>

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

Ich habe das einfach gemacht. Zuerst stellte ich sicher, dass ich die Schreibweise des Markennamens 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 habe den Tag ausgewählt, den ich wollte, und das und nichts weiter wie folgt geholt.

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 mich in einer sauberen Umgebung entwickeln möchte. Ich bin der Meinung, dass dies eher den ursprünglichen Fragen entspricht, "Ich versuche herauszufinden, wie A PARTICULAR TAG heruntergeladen wird", als der Lösung, die vorschlägt, das gesamte Repository zu klonen. Ich verstehe nicht, warum jemand eine Kopie des Windows NT- und Windows 8.1-Quellcodes haben muss, wenn er sich beispielsweise den DOS 0.1-Quellcode ansehen möchte.

Ich wollte CHECKOUT auch nicht benutzen, wie andere vorgeschlagen haben. Ich hatte eine Filiale ausgecheckt und wollte das nicht beeinflussen. Ich wollte die Software holen, die ich wollte, damit ich etwas aussuchen und meiner Entwicklung hinzufügen konnte.

Es gibt wahrscheinlich eine Möglichkeit, das Tag selbst abzurufen, anstatt nur eine Kopie des getaggten Commits. 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 wird ausgeführt, ohne den Arbeitsbaum usw. zu stören. Es scheint nur so, als würde etwas von der Fernbedienung auf den lokalen Computer kopiert, sodass Sie eine eigene Kopie haben.

git fetch gitserver --dry-run Fix_110:Fix_110

wenn die Option --dry-run hinzugefügt wird, können Sie sehen, was der Befehl tun würde, wenn Sie überprüfen möchten, ob er Ihren Wünschen entspricht. Also ich schätze mal 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 Sie Änderungen wiederherstellen, die Ihre erste Softwareänderung umfassen. Also, wenn ich anfange zu arbeiten, mache ich

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

d.h. erstelle ein Commit vor meiner ersten echten Änderung und verwende es dann später

git rebase -i EMPTY 

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

16
Ivan

Ich habe die git checkout documentation durchgesehen und dabei Folgendes festgestellt:

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

So können wir 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
Ändern Sie später einige Dateien
>> git Push - Tags

P.S: 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 eine Verzweigung auschecken und es dann festschreiben und dann ein separates Tag erstellen.

16
None-da

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 basiert auf der GNU -Version, die Situationen wie diejenige, auf die lOranger hingewiesen hat, angemessen behandelt:

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

Wenn Sie einen Mac verwenden, brew install coreutils und rufen Sie stattdessen gsort auf.

8
billwanjohi

versuchen:

git clone -b <name_of_the_tag> <repository_url> <destination>
6
Kamil Zając

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. Dies versetzt Ihr Repository jedoch in den Status "abgetrennter HEAD", was einige negative 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 "abgetrennter HEAD" Änderungen vornehmen und anschließend ein Festschreiben erstellen, bleibt das Tag unverändert, aber Ihr neues Festschreiben gehört keinem Zweig an und ist außer durch den genauen Festschreibungs-Hash nicht erreichbar. Wenn Sie also Änderungen vornehmen müssen, beispielsweise um einen Fehler in einer älteren Version zu beheben, möchten Sie in der Regel einen Zweig erstellen:

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

Wenn Sie dies tun und ein Commit ausführen, unterscheidet sich Ihr Zweig version2 geringfügig von Ihrem Tag v2.0.0, da Ihre neuen Änderungen übernommen werden. Seien Sie also vorsichtig.

5
artamonovdev

Das mache ich ü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 ; \
4
J0hnG4lt