Git Tag 列表,显示提交 sha1 哈希

Posted

技术标签:

【中文标题】Git Tag 列表,显示提交 sha1 哈希【英文标题】:Git Tag list, display commit sha1 hashes 【发布时间】:2012-02-06 11:11:10 【问题描述】:

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

tag1
tag2

git tag -n 打印标签的消息

tag1  blah blah
tag2  blah blah

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

【问题讨论】:

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

要使用 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 哈希开头。

【讨论】:

注意,这不会区分轻量级和带注释的标签。对于轻量级标签,它将显示提交,对于带注释的标签,它将显示标签对象本身的哈希值。 要显示带有取消引用引用的标签列表(如果是带注释的标签),请使用git show-ref --tags -d。取消引用的标签以^ 为后缀。【参考方案2】:

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"

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


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

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

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

【讨论】:

虽然不是 OP 要求的(显示提交 sha1 哈希),但它非常有用,因为提交消息也可能很方便。来自我的 +1。 @nealmcb git log is powerful! 你可以让它准确地显示你想要的。试试git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'。其他日期格式也是可能的。只需在帮助页面中查找--date我已更新我的答案以包含此选项。 @SteliosAdamantidis 实际上我的回答给出了 abbreviated SHA1 哈希(前 7 个字符),如果您想要全长哈希,您可以随时使用 --pretty%H。感谢您的 +1 :) 由于某种我不明白的原因,在 Windows 上(使用 git 2.32.0.windows.2 测试),需要添加一个空格,将%cd%d 更改为%cd %d。只需要从 Windows 命令提示符运行 - Windows 上的“git bash”没有问题。 Windows cmd shell 的完整命令:git log --tags --no-walk --date=iso-local --pretty="%C(auto)%h %cd %d %s" @Nathan 感谢分享。我没有遇到它,因为我通常使用 Git Bash,而不是 Windows cmd shell。您可以使用 Bash 完成许多在命令提示符下无法完成的强大功能。值得学习和切换:)【参考方案3】:

带注释的标签有自己的 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 也会自动遵循带注释的标签。 :)【参考方案4】:

要获取任何类型的 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".【参考方案5】:

我有一个类似的问题,但想要(几个)特定标签的哈希。我发现“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? 中的精彩摘要。

【讨论】:

【参考方案6】:
 git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

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

【讨论】:

很好的解决方案。如果您希望仅使用标记名而不是完整的引用名,您可以更改使用 %(refname:short) 而不是 %(refname)【参考方案7】:

必须对标签进行签名和/或发送消息。轻量级标签没有 SHA1 对象,只是参考。否则试试git show

【讨论】:

【参考方案8】:

我从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

【讨论】:

以上是关于Git Tag 列表,显示提交 sha1 哈希的主要内容,如果未能解决你的问题,请参考以下文章

GitGit 标签使用 ( 查询哈希码 | 创建标签 git tag v1.0 | 查询标签 git tag | 查询标签信息 git show v1.0 | 创建标签并指定说明 | 删除标签 )(代

GitGit 标签使用 ( 查询哈希码 | 创建标签 git tag v1.0 | 查询标签 git tag | 查询标签信息 git show v1.0 | 创建标签并指定说明 | 删除标签 )(代

Git 在哪里存储子模块提交的 SHA1?

git引用初识(HEAD分支tag)

git log

给定合并提交 SHA1,您如何查看/显示已完成的 git 合并冲突解决?