因此,git tag命令列出当前的 git 标记
git tag
tag1 tag2
git tag -n打印标签信息
git tag -n
tag1 blah blah tag2 blah blah
获得 tag1和 tag2的散列的最佳方法是什么?
标签必须经过签名和/或消息传递。轻量级标记没有 SHA1对象,只是参考文献。否则试试 git show。
git show
要使用 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/作为前缀的标记名称。
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散列开始。
^{}
要获得任何类型的 ref (分支、标记...)引用的 SHA1,请使用 git rev-parse:
git rev-parse
git rev-parse tag1^0 tag2^0
它将只打印完整的 SHA1,在单独的行。^0后缀是一种特殊的语法,用于确保打印标记指向的提交的 SHA1,无论它是否有注释。(带注释的标记本身就是对象,它们包含一个指向提交的指针和元数据。如果您确实知道标记是带注释的,并且希望标记为 SHA1,那么只需关闭 ^0即可。)
^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 中判断哪个提交标记指向哪个提交?中的漂亮总结。
带注释的标记有它们自己的 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 tag命令还不完善。需要的东西很多,但是缺少很多,比如提交历史顺序中的完整标记细节和标记。
相反,我喜欢这个,它给出了我想要的但不能从 git tag得到的东西:
git log --oneline --decorate --tags --no-walk
这给出了一个非常漂亮的颜色编码的视图,按照相反的时间顺序显示标记(就像在完整的日志中一样)。这样,您不仅可以看到标记,还可以看到标记提交的缩写散列和提交消息。
我已将其别名为 git t和 git tags如下:
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 文档中都有详细的文档说明。
--date
--pretty
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
这给出了所有提交标记的列表。带注释的标记被取消引用。发送感谢 给你。
我从 Anatoly Techtonik 职位中获取了这个命令,添加了标签/提交的标题消息,并将其格式化为漂亮的协议。
结果是与 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 '|'
如果您希望使用 long-hash 代替 short,只需将 objectname:short替换为 objectname。
objectname:short
objectname