如何找到与给定的git commit相关的标签?


90

对于发行版,我通常使用v1.1.0之类的标签。在构建脚本期间,我正在创建一个包含当前git信息的fwVersion.c文件。目前,我已经提交了文件,并在文件中包含了分支信息,但是我想添加标签。

这可能吗?

Answers:


114

检查文档git describe。它找到与给定提交最接近的标签(即指向该提交的祖先的标签),并根据标签描述该提交。

如果您只想知道提交是否由标签指向,则可以检查以下内容的输出:

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

32
git describe --tags <commit-id>用于未注释的标签
Aleksandr Levchuk 2011年

1
我喜欢这个。特别地,我喜欢我可以从当前的修订版本中获得可读性:git describe --all --exact-match `git rev-parse HEAD`
dsummersl

5
在较新的版本中,git describe --tags --abbrev=0 REV当您不希望标签上出现垃圾时,此功能将非常有用。
Craig Ringer

1
git describe --all(针对当前已签出的提交)或git describe --all <commit>一直以来几乎完成了我想要的所有操作。
rfay 2014年

使用git中的版本最好的部分是在部署软件时不再对源版本进行硬编码。git describe的查找最接近标签的方式可用于计算下一个版本号,只需将标签ref添加到仓库和软件包名称中即可。
2016年

62

如果您想要的是包含提交的第一个标签,则:

git describe --contains <commit>

给出最佳答案IMO。如果您有频繁使用的标签,而不是在大型存储库中的旧提交上使用“ git tag --contains”,则可能需要一段时间才能运行,并为您提供包含该提交的所有标签。

这种形式的git describe运行非常迅速,并为您提供单个输出值,该值是包含提交的第一个标记以及提交的回溯距离。


27

这个怎么样?

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

它为您提供给定提交具有的所有标签(而git describe仅给您一个标签),并且不包括后代提交的标签(像git tag --contains这样)。


我喜欢这样,因为没有错误消息写入stderr。谢谢。
巴苏克,

23

您可以在手册中找到此信息

git tag --contains <commit>

3
这将列出包含给定提交的所有标签(即指向给定提交的子级的标签),因此不一定要为给定提交提供单个标签或有关哪个标签最接近的信息,除非列表仅包含一个提交。
CB Bailey

4
正如查尔斯·贝利(Charles Bailey)所说,这并不是我要找的东西。也许你应该RTFM :)
韦斯

1
好吧,对不起错误的答案。当我检查时,它似乎可以满足您的要求。我做了RTFM,只是在解决错误的问题。希望Bailey提供了可以帮助您的解决方案。
dharga,2009年

6
在对SO提出git问题之前,您不需要阅读整个git手册,对吗?谷歌索引比任何git手册页都好得多...
aaronstacy 2012年

13

我找到了两个最佳答案的组合,可以给我我想要的东西:

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

这将为您提供仅适用于该提交和不带注释的标签。当您想查找标签而又不必担心剥离格式时很有用(例如,对于Jenkins)。

例如。 $ git describe --tags --exact-match head~2

给你:

$ ReleaseBeta

0

合并一些答案:

git tag --contains [<ref>]

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

要不就

git tag

行为相同,为指定的ref或当前提交(如果未指定)打印任何(和所有)标签。

git describe --tags [<ref>]

其中<ref>默认为当前提交,如果没有与该提交关联的标签,则以128退出,并打印与该提交关联的标签(似乎不是一种模式)。

git describe [<ref>]--tags除了只打印带注释的标签外,其 行为与相同。

提供选项--contains,以describe将其打印与指定提交的祖先相关的标签。例如

$ 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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.