Git标签列表,显示commit sha1哈希


101

所以该git tag命令列出了当前的git标签

tag1
tag2

git tag -n 打印标签的消息

tag1  blah blah
tag2  blah blah

获取tag1和tag2哈希值的最佳方法是什么?


1
这不是我考虑单独询问的问题,但我想知道为什么git tag-n或其他选择...)首先不显示提交哈希。很高兴看到人们提出了什么解决方案,但是我认为这是可用选项中的设计缺陷。
andreee

Answers:


142

要获得带有Tag对象的SHA1哈希的git标签,可以运行:

git show-ref --tags

输出将如下所示:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0

每行是标记的SHA1哈希,后跟以开头的标记名称refs/tags/

如果要提交的SHA1哈希,而不是标签对象,则可以运行:

git show-ref --tags -d

这将产生如下输出:

0e76920bea4381cfc676825f3143fdd5fcf8c21f refs/tags/1.0.0
3e233dd8080617685992dc6346f739a6f6396aae refs/tags/1.0.0^{}
5ce9639ead3a54bd1cc062963804e5bcfcfe1e83 refs/tags/1.1.0
09173980152a7ed63d455829553448ece76c6fdc refs/tags/1.1.0^{}
591eceaf92f99f69ea402c4ca639605e60963ee6 refs/tags/1.2.0
56d803caaa8a93a040b7be0b8a36abdc4ce8c509 refs/tags/1.2.0^{}
40414f41d0fb89f7a0d2f17736a906943c05acc9 refs/tags/1.3.0
1bdf628a70fda7a0d840c52f3abce54b1c6b0130 refs/tags/1.3.0^{}

^{}该标记结尾的实际提交的SHA1哈希开头的行开始。


7
请注意,这不会区分轻量级标签和带注释的标签。对于轻量级标签,它将显示提交,对于带注释的标签,它将显示标签对象本身的哈希值。
莉莉·巴拉德

20
要显示带有取消引用的引用的标签列表(在带注释的标签的情况下),请使用git show-ref --tags -d。取消引用的标记后缀为^{}
S. Christoffer Eliesen 2012年

49

git tag命令是不发达。需要很多但缺少的东西,例如完整的标签详细信息和提交历史记录顺序中的标签。

我喜欢这样,它恰好提供了我想要的东西,但不能从中得到git tag

git log --oneline --decorate --tags --no-walk

这样可以按照相反的时间顺序(非常完整的日志中)显示标记的很好的颜色编码视图。这样,您不仅可以看到标签,还可以看到缩写的哈希和标签提交的提交消息。


我将其别名为git tgit tags如下:

git config --global alias.tags "log --oneline --decorate --tags --no-walk"
git config --global alias.t "!git tags"

注意:我必须使用bash重定向,git t因为Git不支持从另一个别名(很糟糕)调用别名。


如果要查看提交日期和时间,请尝试:

git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'

您可以在--date选项中使用其他日期格式,也可以在选项中完全控制输出以匹配您的独特口味--pretty。这两个选项在git-log文档中都有详细记录


2
尽管不是OP询问的内容(显示commit sha1 hash),但它非常有用,因为commit消息也很方便。向我+1。
Stelios Adamantidis

2
@nealmcb git log功能强大!您可以使其准确显示您想要的内容。尝试git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'。其他日期格式也是可能的。只需--date在帮助页面中查找即可。我已更新我的答案以包括此选项。
ADTC '11

1
@SteliosAdamantidis实际上,我的答案给出了SHA1哈希的缩写(前7个字符),如果要使用全长哈希,可以随时使用--pretty和对其进行修改%H。感谢您的+1 :)
ADTC '11

15

带注释的标签具有自己的SHA-1,因此我们需要取消引用它们。但是,轻量级标记无法取消引用,因为它们已指向提交。为了解决这个问题,我们必须同时列出并过滤提交对象:

git for-each-ref --sort -v:refname --format '%(objectname) %(objecttype) %(refname)
%(*objectname) %(*objecttype) %(*refname)' refs/tags | grep commit

轻量级标签的结果:

589610a0114a375f1bff716dd308cf8df08571d3 commit refs/tags/1.4.9
e25952a74bf379783944bef9c4fcc60600cb764c commit refs/tags/1.4.8
19b1c2c96a9678837f57eac86cf3d22842731510 commit refs/tags/1.4.7
7208212a55c4a56af34da781a7f730d6ddd557a1 commit refs/tags/1.4.6
62ec20337a4125496bd4f56288f3283963153194 commit refs/tags/1.4.5

带注释标签的结果:

e2b2d6a172b76d44cb7b1ddb12ea5bfac9613a44 commit refs/tags/v2.11.0-rc3^{}
1310affe024fba407bff55dbe65cd6d670c8a32d commit refs/tags/v2.11.0-rc2^{}
3ab228137f980ff72dbdf5064a877d07bec76df9 commit refs/tags/v2.11.0-rc1^{}
1fe8f2cf461179c41f64efbd1dc0a9fb3b7a0fb1 commit refs/tags/v2.11.0-rc0^{}
454cb6bd52a4de614a3633e4f547af03d5c3b640 commit refs/tags/v2.11.0^{}

使用git log --tags --oneline --no-walk还将自动引用带注释的标签。:)
ADTC '11

11

要获取任何种类的ref(分支,标签...)所引用的SHA1,请使用git rev-parse

git rev-parse tag1^0 tag2^0

它将仅在单独的行上打印完整的SHA1。该^0后缀是一个特殊的语法,以确保这将打印SHA1由标签提交指向的,无论是注释与否。(带注释的标签本身就是对象,其中包含指向提交的指针以及元数据。如果您确实知道标签是带注释的,并且想要标签的SHA1,则只需省略^0。)。

当然,您不必经常这样做,因为任何接受SHA1的Git命令也应接受标签!


最好的答案在这里,谢谢@Jefromi。请注意,在Windows cmd shell中,需要使用^引用任何git命令:例如git rev-parse“ tag1 ^ 0”“ tag2 ^ 0”。
yoyo

8

我有一个类似的问题,但是想要(几个)特定标签的哈希。我发现“ show-ref”将使用标签列表,因此可以完成此工作:

% git show-ref v3.4.0.13-ga v3.4.0.13-base
bfc7747c4cf67a4aacc71d7a40337d2c3f73a886 refs/tags/v3.4.0.13-base
79ba365e75a4f9cee074d25a605a26acb660b7de refs/tags/v3.4.0.13-ga

但是,对“ git show”进行的一些实验导致此命令:

% git show --summary --oneline --decorate v3.4.0.13-ga v3.4.0.13-base
79ba365 (tag: v3.4.0.13-ga, rhins013a) commit message the first
bfc7747 (tag: v3.4.0.13-base) commit message the second

由于比起“ show-ref”,我对“ show”的使用更加熟悉,因此我发现后者更容易记住并且也更有帮助。

另请参见如何在Git中识别标记所指向的提交中的摘要



3
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

这给出了所有标签提交的列表。带注释的标签被取消引用。在这里发送谢谢。


很好的解决方案。如果您希望只有tagenames而不是完整的refname,则可以更改use %(refname:short)而不是%(refname)
Radon8472

2

我从anatoly techtonik帖子中获取了命令,添加了标签/ commits的标题消息,并将其格式化为漂亮的cols。

结果是输出相同,git tag -n但带有commit-hash作为前缀。

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'

如果您希望使用长哈希而不是短哈希,请替换objectname:shortobjectname

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.