Wie finde ich das Tag, das einem bestimmten Git-Commit zugeordnet ist?

89

Für Releases tagge ich normalerweise mit etwas wie v1.1.0. Während meines Build-Skripts erstelle ich eine fwVersion.c-Datei, die die aktuellen Git-Informationen enthält. Derzeit habe ich Commit- und Zweiginformationen in der Datei, möchte aber das Tag hinzufügen.

Ist das möglich?

wir s
quelle

Antworten:

112

Überprüfen Sie die Dokumentation auf git describe. Es findet das einem bestimmten Commit am nächsten liegende Tag (dh ein Tag, das auf einen Vorfahren des Commits verweist) und beschreibt dieses Commit anhand des Tags.

Wenn Sie nur wissen möchten, ob ein Tag auf das Commit zeigt, können Sie die Ausgabe von:

git describe --exact-match <commit-id>
CB Bailey
quelle
32
git describe --tags <commit-id>für nicht kommentierte Tags
Aleksandr Levchuk
1
Ich liebe es. Insbesondere finde ich es toll, dass ich aus der aktuellen Revision einen Menschen lesbar machen kann:git describe --all --exact-match `git rev-parse HEAD`
dsummersl
5
In neueren Versionen ist git describe --tags --abbrev=0 REVdies hilfreich, wenn Sie den Müll nicht auf dem Tag haben möchten.
Craig Ringer
1
git describe --all(für das aktuell ausgecheckte Commit) oder git describe --all <commit>haben immer fast alles getan, was ich jemals wollte.
Rfay
Der beste Teil bei der Verwendung von Versionen von Git ist, dass die Version in der Quelle nicht mehr fest codiert wird, wenn eine Software bereitgestellt wird. Die Methode der Git-Beschreibung zum Finden des nächsten Tags kann verwendet werden, um die nächste Versionsnummer zu berechnen und dem Repo und dem Paketnamen einfach eine Tag-Referenz hinzuzufügen.
Sid
62

Wenn Sie das erste Tag möchten, das das Commit enthält, dann:

git describe --contains <commit>

gibt die beste Antwort IMO. Wenn Sie häufige Tags haben als die Verwendung von "git tag --contains" für ein altes Commit in einem großen Repository, kann die Ausführung eine Weile dauern und Sie erhalten alle Tags, die dieses Commit enthalten.

Diese Form der Git-Beschreibung wird sehr schnell ausgeführt und gibt Ihnen einen einzelnen Ausgabewert, der das erste Tag ist, das das Commit enthält, und wie weit Ihr Commit zurückliegt.

Jay
quelle
26

Wie wäre es damit?

git tag --points-at <commit-id>

Es gibt Ihnen alle Tags, die das angegebene Commit hat (während git describees Ihnen nur eines gibt), und enthält keine Tags für Nachkommen-Commits (wie dies der git tag --containsFall ist).

Albertas Agejevas
quelle
Ich mag das, weil keine Fehlermeldung an stderr geschrieben wird. Vielen Dank.
Basuke
22

Sie finden diese Informationen im Handbuch

git tag --contains <commit>
Dharga
quelle
3
Dadurch werden alle Tags aufgelistet, die das angegebene Commit enthalten (dh Tags, die auf untergeordnete Elemente des angegebenen Commits verweisen). Es wird also nicht unbedingt ein einzelnes Tag für ein bestimmtes Commit oder Informationen darüber angegeben, welches Tag am nächsten liegt, es sei denn, das Liste enthält nur ein einziges Commit.
CB Bailey
4
Wie Charles Bailey oben sagt, ist das nicht genau das, wonach ich suche. Vielleicht solltest du RTFM :)
wes
1
Entschuldigung für die falsche Antwort. Als ich nachgesehen habe, schien es zu tun, wonach Sie gefragt haben. Ich habe RTFM gemacht, ich habe nur das falsche Problem gelöst. Hope Bailey hat eine Lösung angeboten, die Ihnen hilft.
Dharga
6
Sie sollten nicht das gesamte Git-Handbuch lesen müssen, bevor Sie eine Git-Frage zu SO stellen, oder? Google-Indizes so viel besser als jede Git-Manpage ...
Aaronstacy
13

Ich fand die Kombination der beiden Top-Antworten, um mir zu geben, was ich wollte:

git describe --tags --exact-match <commit-id>

Dies gibt Ihnen das Tag, das NUR für dieses Commit und für diejenigen ohne Anmerkung ist. Nützlich, wenn Sie Tags suchen möchten und sich nicht darum kümmern müssen, die Formatierung zu entfernen (z. B. für Jenkins).

z.B. $ git describe --tags --exact-match head~2

Gibt Ihnen:

$ ReleaseBeta
Christopher Alexander
quelle
0

Einige der Antworten konsolidieren:

git tag --contains [<ref>]

und

git tag --points-at [<ref>]

oder nur

git tag

Verhalten Sie sich gleich und drucken Sie alle (und alle) Tags für die angegebene Referenz oder das aktuelle Commit, falls nicht angegeben.

git describe --tags [<ref>]

wo <ref>standardmäßig die aktuellen begeht, Ausfahrten mit 128 , wenn keine Tags zugeordnet sind , mit dem Commit, und druckt einen Tag im Zusammenhang mit der Commit (es scheint kein Muster zu sein).

git describe [<ref>] verhält sich genauso wie mit, --tagsaußer dass nur kommentierte Tags gedruckt werden.

Wenn Sie die Option --containszum describeDrucken eines Tags verwenden, das einem Vorfahren des angegebenen Commits zugeordnet ist. Beispielsweise

$ git init
Initialized empty Git repository in /tmp/test
$ git commit -m one --allow-empty
[master (root-commit) 7fdfff2] one
$ git commit -m two --allow-empty
[master cd5f8f1] two
$ git tag -am foo foo
$ git tag bar
$ git log --format=oneline
cd5f8f1f4f29eb164f83e224768ccaf37fe170ed (HEAD -> master, tag: foo, tag: bar) two
7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1 one
$ git describe 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
fatal: No tags can describe '7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1'.
Try --always, or create some tags.
$ git describe --contains 7fdfff2ce5e3347f8eee4c9f2413dbd4e90060e1
bar~1

bschlueter
quelle