2117 Stimmen

Herunterladen eines bestimmten Tags mit Git

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 einen Tag für die vorherige Version auf der Git-Webseite gab, mit einem Objektnamen von einer langen hexadezimalen Zahl.

Der Versionsname lautet jedoch " Tagged release 1.1.5 ", heißt es auf der Website.

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 erhalten - ein Verzeichnis, eine Reihe von Unterverzeichnissen usw.

Wenn es das gesamte Repository ist, wie komme ich dann an die gesuchte Version? Wenn nicht, wie kann ich diese spezielle Version herunterladen?

11 Stimmen

Ich entwickle auf einem völlig anderen Projektarchiv als die Produktion, so dass meine Produktion keine Tags kannte, als ich versuchte, git checkout zu verwenden. Die Lösung war, "git pull --tags" zu verwenden und dann git checkout zu benutzen.

13 Stimmen

"git fetch --tags" funktioniert auch

18 Stimmen

Um zu vermeiden, dass das gesamte Repository geklont und dann zu einem Tag gewechselt wird, können Sie direkt eine clone -b "Tagged release 1.1.5" http://git.abc.net/git/abs.git my_abc . Dies funktioniert natürlich nur, wenn Sie keine Verzweigung mit demselben Namen haben (je nach Ihrer Methodik kann dies nie der Fall sein).

59voto

eyecatchUp Punkte 9094

Verwenden Sie die --single-branch Schalter (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 löst Deltas nur für den angegebenen Zweig/das angegebene Tag auf - und checkt dabei genau dieselbe Anzahl von Dateien aus! Je nach Quellcode-Repository können Sie so eine Menge Speicherplatz sparen. (Und es geht viel schneller.)

4 Stimmen

Wer auch immer diese Antwort herabgestuft/abgewertet hat: Bitte hinterlassen Sie auch einen Kommentar mit einer kurzen Erklärung für die Herabstufung. (Ich frage nur, weil ich ein bisschen verwirrt bin. Denn afaik ist dies die beste Lösung für das gegebene Problem. Und wenn Sie nicht so denken, würde ich gerne wissen, warum). Vielen Dank!

7 Stimmen

Versuchen Sie nicht, den Downvotes zu viel Bedeutung beizumessen Ihre Antwort ist sehr gut, ihre Downvotes sind wahrscheinlich unbegründet so ist das Leben auf SOF.

34voto

tk_ Punkte 14471

Zunächst alle Tags in dieser bestimmten entfernten Umgebung abrufen

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

oder geben Sie einfach ein

git fetch <remote>

Suchen Sie dann nach den verfügbaren Tags

git tag -l

wechseln Sie dann mit dem folgenden Befehl zu diesem speziellen Tag

git checkout tags/<tag_name>

Ich hoffe, das hilft Ihnen!

0 Stimmen

Warum sollte man "git tag -l" verwenden, wenn es dasselbe wie "git tag" ist?

2 Stimmen

@serup; git tag fügt einen Tag hinzu, während git tag -l listet die verfügbaren Tags auf

19voto

Peter Johnson Punkte 2593

Wenn Ihre Tags mit Hilfe des linux sort verwenden Sie diesen Befehl:

git tag | sort -n | tail -1

z.B. wenn git tag zurü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 zweitjüngsten Tag gefragt haben)

um das Tag auszuchecken, klonen Sie zuerst das Repository und geben dann ein:

git checkout v1.0.4

oder was immer Sie brauchen.

26 Stimmen

Bis man v1.0.10 erreicht, und dann passieren schlimme Dinge :)

10 Stimmen

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

0 Stimmen

Einzeiler zum automatischen Auschecken der neuesten Version, git checkout `git tag | sort -n | tail -1`

17voto

Ivan Punkte 3867
git fetch <gitserver> <remotetag>:<localtag>

\===================================

Das habe ich gerade getan. Zuerst habe ich mich vergewissert, dass ich die Schreibweise des Tag-Namens kenne.

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

Dadurch erhielt ich eine Liste von Tags auf meinem Git-Server, aus der ich auswählen konnte. Der ursprüngliche Poster kannte den Namen seines Tags bereits, so dass dieser Schritt nicht für jeden notwendig ist. Die Ausgabe sah wie folgt aus, obwohl die echte 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 den gewünschten Tag aus und holte diesen und nichts weiter wie folgt ab.

git fetch gitserver Fix_110

Dann habe ich diese auf meinem lokalen Rechner mit einem Tag versehen und meinem Tag denselben Namen gegeben.

git tag Fix_110 FETCH_HEAD

Ich wollte das entfernte Repository nicht klonen, wie es andere Leute vorgeschlagen haben, da das Projekt, an dem ich arbeite, groß ist und ich in einer sauberen Umgebung entwickeln möchte. Meiner Meinung nach ist dies näher an der ursprünglichen Frage "Ich versuche herauszufinden, wie man einen BESTIMMTEN TAG herunterlädt" als die Lösung, die vorschlägt, das gesamte Repository zu klonen. Ich sehe nicht ein, warum jemand eine Kopie des Quellcodes von Windows NT und Windows 8.1 haben sollte, wenn er sich den Quellcode von DOS 0.1 (zum Beispiel) ansehen möchte.

Ich wollte auch nicht, wie von anderen vorgeschlagen, CHECKOUT verwenden. Ich hatte einen Zweig ausgecheckt und wollte diesen nicht beeinträchtigen. Meine Absicht war es, die Software zu holen, die ich wollte, damit ich mir etwas herauspicken und in meine Entwicklung einbringen konnte.

Es gibt wahrscheinlich eine Möglichkeit, das Tag selbst zu holen und nicht nur eine Kopie des Commits, der getaggt wurde. Ich musste den geholten Commit selbst taggen. EDIT: Ah ja, jetzt habe ich es gefunden.

git fetch gitserver Fix_110:Fix_110

Wo Sie den Doppelpunkt sehen, heißt es remote-name:local-name und hier sind es die Tag-Namen. Dies läuft, ohne den Arbeitsbaum usw. zu stören. Es scheint nur Dinge vom entfernten auf den lokalen Rechner zu kopieren, damit Sie Ihre eigene Kopie haben.

git fetch gitserver --dry-run Fix_110:Fix_110

mit der hinzugefügten Option --dry-run können Sie sich ansehen, was der Befehl tun würde, wenn Sie überprüfen wollen, ob es das ist, was Sie wollen. Ich schätze, eine einfache

git fetch gitserver remotetag:localtag

ist die wahre Antwort.

\=

Eine separate Anmerkung zu Tags ... Wenn ich etwas Neues beginne, markiere ich normalerweise das leere Repository nach git init, da

git rebase -i XXXXX 

erfordert ein Commit, und es stellt sich die Frage: "Wie bindet man Änderungen, die die erste Softwareänderung beinhalten, wieder ein?" Wenn ich also mit der Arbeit beginne, mache ich

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

d.h. einen Commit vor meiner ersten echten Änderung erstellen und dann später

git rebase -i EMPTY 

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

16voto

None-da Punkte 2793

Ich habe die Git-Checkout-Dokumentation hat eine interessante Sache ergeben:

git checkout -b <neuer_Zweig_name> <Startpunkt> , wobei <Startpunkt> der Name einer Übergabe ist ist, an dem der neue Zweig beginnen soll; Standardmäßig wird HEAD verwendet.

Wir können also den Tag-Namen (da Tag nichts anderes als der Name einer Übergabe ist) als, sagen wir, erwähnen:

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

P.S.: In Git kann man ein Tag nicht direkt aktualisieren (da ein Tag nur ein Label für einen Commit ist), man muss das gleiche Tag als Zweig auschecken und dann einen Commit dazu machen und dann ein separates Tag erstellen.

1 Stimmen

Wenn Sie keine Änderungen erwarten und nur sehen wollen, wie der Code an diesem Tag aussah, können Sie den Tag einfach auschecken, ohne einen Zweig zu erstellen. Sie erhalten einen Text, der Ihnen erklärt, dass Sie sich im Zustand des "abgetrennten Kopfes" befinden, und Sie können die Verzweigung später immer noch erstellen, wenn Sie das möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X