Git标签列表,显示提交sha1哈希值

时间:2012-01-09 23:13:07

标签: git logging hash git-tag verbose

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

tag1
tag2

git tag -n打印标记的消息

tag1  blah blah
tag2  blah blah

获取tag1&的散列的最佳方法是什么? tag2?

8 个答案:

答案 0 :(得分:114)

这个怎么样?

git show-ref --tags

答案 1 :(得分:33)

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

我喜欢这样,它提供了我想要但却无法从git tag得到的东西:

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

这给出了一个非常漂亮的颜色编码的标签视图,反向按时间顺序排列(就像在完整日志中一样)。这样,您不仅可以看到标签,还可以看到标签提交的缩写哈希和提交消息。


我将其别名为 git t git tags ,如下所示:

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

注意: 我必须对git t使用bash重定向,因为Git不支持从另一个别名调用别名(这是一个长号)。


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

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

您可以在--date选项中使用其他日期格式,并完全控制输出以符合您在--pretty选项中的独特品味。这两个选项都在git-log Documentation中详细记录。

答案 2 :(得分:13)

带注释的标签有自己的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^{}

答案 3 :(得分:8)

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

git rev-parse tag1^0 tag2^0

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

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

答案 4 :(得分: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”而不是“show-ref”,我觉得后者更容易记住,也更有用。

另请参阅How to tell which commit a tag points to in Git?中的精彩摘要。

答案 5 :(得分:3)

标签必须签名和/或发送消息。轻量级标签没有SHA1对象,只是引用。否则请尝试git show

答案 6 :(得分:2)

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

这给出了标签的所有提交的列表。带注释的标签被解除引用。感谢here

答案 7 :(得分:0)

我从anatoly techtonik post处获得命令,添加了标记/提交的标题消息,并将其格式化为漂亮的列。

结果是与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:short替换为objectname