如何在 git 中列出所有标签以及完整消息?

Posted

技术标签:

【中文标题】如何在 git 中列出所有标签以及完整消息?【英文标题】:How to list all tags along with the full message in git? 【发布时间】:2011-07-18 12:25:21 【问题描述】:

我希望 git 列出所有标签以及完整的注释或提交消息。这样的事情很接近:

git tag -n5

这正是我想要的,只是它只会显示标签消息的前 5 行。

我想我可以使用一个非常大的数字。我可以在这里使用的最高数字是多少?每台电脑都一样吗?

更新:我有很多时间来考虑这个问题,现在我想如果其中一些非常长,我不一定要显示每条消息的全部内容。我真的没有任何特殊的需要需要我看到大量的消息(除了我自己倾向于在我写的所有内容中冗长,包括标签消息)。我只是不喜欢它不一定会向我展示整个信息的想法,因为这让我觉得它在向我隐藏信息。但是太多的信息也可能是一件坏事。

【问题讨论】:

git tag -n 为我做的 git tag -n 仅打印注释的第一行,根据手册页。 @INTPner,同意,-l 标签用于列出具有特定模式的标签。编辑答案。 【参考方案1】:

试试这个,它将列出所有标签以及注释和每个标签的 9 行消息:

git tag -n9

也可以使用

git tag -l -n9

如果要列出特定的标签:

git tag -l -n9 v3.*

(例如,上面的命令只会显示以“v3”开头的标签)

-l , --list 列出名称与给定模式匹配的标签(如果没有给出模式,则列出所有标签)。 不带参数运行“git tag”也会列出所有标签。模式是一个 shell 通配符 (即,使用 fnmatch(3) 匹配)。可以给出多种模式;如果其中任何一个 匹配,显示标签。

【讨论】:

这只会打印每个注释的第一行。 @Paul Price:只有你有注释,否则它会打印提交消息。同意这不是 答案。 根据文档,-l 选项用于过滤模式。我看不出这在这里会有什么帮助。我错过了什么吗? @INTPnerd 是的,-l 在这里完全是多余的 @P.MyerNore 您必须使用奇怪版本的 git 或传递其他参数来做比这个问题所要求的更多的事情。但很高兴知道在某些情况下需要 -l。【参考方案2】:
git tag -n99

短而甜。这将列出来自每个标签注释/提交消息的多达 99 行。 Here is a link to the official documentation for git tag.

我现在认为每个标签最多只能显示 99 行的限制实际上是一件好事,因为大多数时候,如果单个标签真的超过 99 行,你就不会真的想看到所有剩下的行你会吗?如果您确实希望看到每个标签的行数超过 99 行,您可以随时将其增加到更大的数字。

我的意思是,我想可能有特定的情况或原因想要查看大量标签消息,但您在什么时候不想查看整个消息?当它有超过 999 行时? 10,000? 1,000,000?我的观点是,通常对您将看到的行数设置一个上限是有意义的,而这个数字允许您设置它。

由于我正在就您在查看标签时通常希望看到的内容进行论证,因此将这样的内容设置为别名可能是有意义的(来自 Iulian Onofrei 的以下评论):

git config --global alias.tags 'tag -n99'

我的意思是,您真的不想每次只想查看标签时都输入git tag -n99 吗?配置好别名后,只要您想查看标签,只需在终端中输入 git tags 即可。就个人而言,我更喜欢比这更进一步,为我所有常用的命令创建更缩写的 bash 别名。为此,您可以在 .bashrc 文件中添加类似的内容(适用于 Linux 和类似环境):

alias gtag='git tag -n99'

然后,只要您想查看您的标签,只需输入gtag。使用别名路径(git 别名或 bash 别名或其他)的另一个优点是您现在已经有了一个位置,您可以在其中添加进一步的自定义设置,通常希望您的标签显示给您(例如排序它们以某些方式,如我在下面的评论等)。一旦你克服了创建你的第一个别名的麻烦,你现在就会意识到为你喜欢以定制方式工作的其他事情创建更多别名是多么容易,比如git log,但让我们把它保存为不同的问题/答案。

【讨论】:

git config --global alias.tags 'tag -n99' @IulianOnofrei,很好,我不知道 git 允许你定义别名。我意识到这是题外话,但我无法抗拒。这就是我现在使用的(放在你的 .bashrc 或类似的东西中):alias gtag='git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags | sort -V'【参考方案3】:

Mark Longair's answer(使用git show)接近问题中的期望值。但是,它还包括标记指向的提交,以及该提交的完整补丁。由于提交可能与标签无关(它只是标签试图捕获的一个提交),这可能是不可取的。我相信以下内容会更好一些:

for t in `git tag -l`; do git cat-file -p `git rev-parse $t`; done

【讨论】:

Mark 的 git show 没有显示我使用的补丁。他的命令省略了 -p 或 --patch,但要完全确定跳过差异,可以使用:--no-patch。 (在 git v2.7.1/mac 上)【参考方案4】:

它远非漂亮,但你可以创建一个脚本或别名来做这样的事情:

for c in $(git for-each-ref refs/tags/ --format='%(refname)'); do echo $c; git show --quiet "$c"; echo; done

【讨论】:

是否有理由不将git for-each-ref refs/tags/ --format='%(refname)' 替换为git tag -l @ShaiBerger:实际上,我不这么认为-我想我只是认为git tag是瓷器,git for-each-ref是管道,所以后者的输出应该更稳定用于脚本。 基于这个答案,我使用 git log 而不是 git show 来获得更漂亮的结果:for c in $(git tag -l); do git tag -l -n1 $c; echo Commit message: `git log -n1 --format=%B --quiet "$c"`; echo; done【参考方案5】:

使用 --format 选项

git tag -l --format='%(tag) %(subject)'

【讨论】:

【参考方案6】:

仅最后一个标签消息:

git cat-file -p $(git rev-parse $(git tag -l | tail -n1)) | tail -n +6

【讨论】:

对于谷歌的其他人来说:如果你想显示来自特定标签的消息:git cat-file -p <tag> | tail -n +6【参考方案7】:
git tag -l --format='%(contents)'

git for-each-ref refs/tags/ --format='%(contents)'

将为每个标签输出完整的注释消息(包括签名,如果已签名)。

%(contents:subject) 只会输出第一行 %(contents:body) 将输出没有第一行和签名的注释(仅有用的文本) %(contents:signature) 将只输出 PGP 签名

man git-for-each-ref “Field names” section 中查看更多信息。

【讨论】:

如果你也想包含标签,你可以使用:git tag -l --format='%(tag): %(contents)' 更好,git tag -l --format="%(tag)"$'\n'"%(contents)"【参考方案8】:

我更喜欢在命令行上执行此操作,但如果您不介意 Web 界面并且使用 GitHub,则可以访问 https://github.com/user/repo/tags 并单击每个标签旁边的“...”以显示其注释.

【讨论】:

【参考方案9】:

“git tag -n”怎么样 朱先生为这个答案做出了贡献。

【讨论】:

以上是关于如何在 git 中列出所有标签以及完整消息?的主要内容,如果未能解决你的问题,请参考以下文章

Git基础-打标签

如何在 git 存储库中列出我当前的所有 TODO 消息?

Git-打标签

版本控制git之五-标签管理

Git4:Git标签

如何在 git 中获取所有本地和远程标签?