列出 git 标签名称、日期和消息

Posted

技术标签:

【中文标题】列出 git 标签名称、日期和消息【英文标题】:List git tag names, dates and messages 【发布时间】:2012-08-26 12:33:08 【问题描述】:

如何列出所有标签的标签名称、标签日期和标签消息?

似乎 git 通过git log 将提交的显示逻辑和通过git tag 标记的显示逻辑分开,使得很难列出标记名称、标记的日期和标记消息。

我可以使用git log --tags --show-notes --simplify-by-decoration --pretty="format:%ai %d %s"显示标签日期、名称和提交消息

我检查了http://opensource.apple.com/source/Git/Git-26/src/git-htmldocs/pretty-formats.txt,但没有看到任何显示标签消息的选项。

我可以使用git tag -n5显示标签名称和5行标签信息

但是要获得所有这三个信息似乎需要超出我能力范围的粗糙脚本。

【问题讨论】:

【参考方案1】:

颜色更好一点的格式怎么样?

# ~/.gitconfig
[alias]
tags="for-each-ref --sort=taggerdate --format='%(color:green)%(subject)%(color:reset), tagged: %(refname:short)\n%(taggerdate)\n%(taggername) %(taggeremail)\n\n%(contents:body)\n' refs/tags"

$ git tags 

Release 1.0.1, tagged: 1.0.1
Wed Jul 4 20:16:05 2018 +0430
Sepehr Lajevardi <sepehr.lajevardi@...>

Changelog
- Implement Contentful webhooks to purge internal and CF caches.
- Implement CloudFlareService.
- Fix Contentful's mapping concern usage/namespace. #73
- Temporarily enforce https in og:url property. #103
- Fix entry callback issue with Contentful client. #99
- Fix issue with PPM docker build. #96

Release 1.1.2, tagged: 1.1.2
Thu Jul 12 21:26:29 2018 +0430
Sepehr Lajevardi <sepehr.lajevardi@...>

Changelog
- Fix GA share event issue with AddThis. #132
- Optimize OpenGraph protocol tags for articles. #130
- Optimize Twitter card tags. #131
- Fix HTML validation errors as much as possible. #127


Release 1.1.3, tagged: 1.1.3
Mon Jul 16 22:49:05 2018 +0430
Sepehr Lajevardi <sepehr.lajevardi@...>

Changelog
- Implement cross-device/browser fav/home icons. #137, #138
- Minify HTML output of all pages. #139
- Check for lighthouse score in build pipeline. #30
- Drop AddThis in favor of in-house ShareBar. #116
- Minor article OG tag adjustments.

【讨论】:

您的别名中缺少开头的 '【参考方案2】:

git tag --format="%(refname:short) %(authordate) %(authorname) %(subject)"

示例输出

0.4.0 2016 年 11 月 2 日星期三 11:17:50 -0400 船长明显发布:0.4.0

格式字段与git-for-each-ref 相同。

【讨论】:

【参考方案3】:

在你的仓库中使用这个终端命令

git show --tags --no-patch

您可以使用与git log 相同的--format= 名称选项(单行、短、中、完整、自定义)来控制格式。

git show --tags --no-patch --format=short

【讨论】:

【参考方案4】:

如果您想获取最新的标签详细信息,请使用--sort 标志,请记住,如果您是按日期排序,请在日期前使用“-”以首先列出最新的。

例如,我想要最新的标签描述(因为它恰好是最新的版本名称),我使用 --format 来拉出标签的主题并按照 taggerdate 方式对其进行排序(最新的优先)。这是执行此操作的命令。

git for-each-ref --sort=-taggerdate --format '%(subject)' refs/tags --count=1

【讨论】:

【参考方案5】:

您想使用for-each-ref 命令。不幸的是,它的用户友好性只比filter-branch差一点点

请注意,标签日期和标注器等信息仅适用于带注释的标签。

下面是一个基本原型。请注意, format= 可以是它自己的整个 shell 脚本,并且可能应该取决于您想要输出的复杂程度。他们有几个专门针对标签in the for-each-ref documentation

的示例
git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags

【讨论】:

使用通过 Github Releases 创建的带有自动生成的标签名称的标签,这将显示来自相关提交的提交消息,而不是来自输入到 GUI 中的标签的消息。这表明 Github 没有使用 git tag -a 而是使用其他方法? 这听起来像是一个没有注释的标签。那些只是存储一个指向 SHA 的指针。 似乎不支持 git-log 格式选项,例如用于表格输出的 % 【参考方案6】:

这是Andrew's 回复的后续问题,略有不同但相关主题。

git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags

这在直接命令行上效果很好。当我在 ~/.gitconfig 中设置一个 git 别名时,它似乎没有喷出相同的输出。

当直接在命令行上调用时,我明白了。

package-release-14.7.2 Wed Dec 3 14:24:38 2014 -0800 14.7.2:复制标签 package-release-14.7.2 package-release-14.7.3 Thu Dec 4 14:14:55 2014 -0800 14.7.3:复制标签 package-release-14.7.3 package-release-14.7.4 Fri Dec 5 16:16:40 2014 -0800 14.7.4:复制标签 package-release-14.7.4

当我调用 git 别名(taghist = for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags)时,我得到

package-release-14.7.2 包发布-14.7.3 包发布-14.7.4

-桑

【讨论】:

使用 \" 而不是 ",然后编辑它以提供如何在别名中执行此操作的答案,否则它不是答案 taghist = for-each-ref --format=\"%(refname:short) %(taggerdate) %(subject) %(body)\" refs/tags【参考方案7】:

不知道有没有办法

列出所有标签的标签名称、标签日期和标签消息 只使用 git 语法

但是一个简单的 grep 就可以完成这项工作:

git show --tags |grep "^tag " -A4

请注意,我在匹配后指定了 4 行尾随上下文,因为标准输出在单独的行中显示标签名称、标签日期和标签消息。

如果您需要处理多行标记消息,我更喜欢使用管道连接到 awk,这会稍微麻烦一些:

git show --tags |awk "/^tag /,/-----BEGIN PGP SIGNATURE-----|commit /" |egrep -v "^$" |sed -E "s/^-----BEGIN PGP SIGNATURE-----.*|^commit.*/-/"

只要标签消息后面跟着 PGP 签名或提交消息,这将起作用,afaik 都是可能的情况。但是,您可以轻松地调整最后一个 grep 以涵盖其他情况(如果有的话)。

【讨论】:

我使用 Github Releases 功能使用其自动创建的标记名(提交 sha)创建了我的标记。在那个 repo 上,上面的命令不起作用,我没有从 grep 得到任何输出,并且从 git show --tags 得到大量无用的输出。不过谢谢你的想法!【参考方案8】:

git show --tags 至少会输出有关您的标签的所有相关信息。您或许可以从那里找到合适的--pretty=format: 序列。

【讨论】:

git show --tags 的表达方式看起来非常复杂,顺便说一句,它似乎没有适合问题作者需要的格式。 @MichałPolitowski 是的。 git show --tags 会做同样的事情。相应地编辑答案。

以上是关于列出 git 标签名称、日期和消息的主要内容,如果未能解决你的问题,请参考以下文章

sh Git - 从日期/之后列出提交。

sh Git - 从日期/之后列出提交。

sh Git - 从日期/之后列出提交。

sh Git - 从日期/之后列出提交。

sh Git - 从日期/之后列出提交。

sh Git - 从日期/之后列出提交。