所以git tag
命令列出了当前的 git 标签
tag1
tag2
git tag -n
打印标签的消息
tag1 blah blah
tag2 blah blah
获取 tag1 和 tag2 哈希值的最佳方法是什么?
要使用 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 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"
注意:我不得不使用 bash 重定向进行git t
,因为 Git 不支持从另一个别名调用别名(这是一个无赖(。
如果要查看提交日期和时间,请尝试:
git log --tags --no-walk --date=iso-local --pretty='%C(auto)%h %cd%d %s'
您可以在--date
选项中使用其他日期格式,也可以在--pretty
选项中完全控制输出以匹配您的独特口味。这两个选项在 git-log 文档中都有很好的记录。
注释标签有自己的 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^{}
要获取任何类型的引用(分支,标签...(引用的SHA1,请使用git rev-parse
:
git rev-parse tag1^0 tag2^0
它将仅在单独的行上打印完整的 SHA1。^0
后缀是一种特殊的语法,以确保这将打印标记指向的提交的 SHA1,无论它是否经过批注。 (带注释的标记本身就是对象,其中包含指向提交的指针以及元数据。如果您确实知道标记已注释,并且想要标记的 SHA1,只需省略^0
即可。
当然,您不应该经常需要这样做,因为任何接受 SHA1 的 Git 命令也应该接受标签!
我有一个类似的问题,但想要(几个(特定标签的哈希值。 我发现"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",我发现后者更容易记住,也更有帮助。
另请参阅如何判断标签在 Git 中指向哪个提交?中的精彩摘要。
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
这将给出标记的所有提交的列表。带批注的标记将被取消引用。在这里表示感谢。
标签必须签名和/或发送消息。轻量级标记没有 SHA1 对象,只是引用。否则,请尝试git show
。
我从 anatoly techtonik 帖子中获取了命令,添加了标签/提交的标题消息并将其格式化为漂亮的 cols。
结果是输出与git tag -n
相同,但以提交哈希作为前缀。
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname:short)%(else)%(objectname:short)%(end)|%(refname:short)|%(contents:subject)' refs/tags | column -t -s '|'
如果你喜欢用长哈希而不是短哈希,yust 用 objectname
替换objectname:short
。