如何在git中列出所有标签并包含完整的提交信息?

485

我希望git列出所有标签以及完整的注释或提交信息。类似这样的内容接近我的要求:

git tag -n5
这正是我想要的,但它只会显示标签消息的前5行。我猜我可以使用一个非常大的数字。这里我能用的最大数字是多少?它在每台电脑上都一样吗?
更新:我已经有很多时间来考虑这个问题,现在我认为如果某些消息特别长,我不一定需要显示每条消息的全部内容。除了我倾向于在写的所有内容中包含自己的冗长之外,我实际上没有任何特殊需要。我只是不喜欢它可能不会完全显示消息的想法,因为这让我觉得它正在向我隐藏信息。但太多信息也不是好事。

90
"git tag -n" 对我很有帮助。该命令为我提供了所需的信息。 - Martin Berger
16
根据手册,git tag -n 只会打印批注的第一行。 - Paul Price
@INTPner,同意,-l标记用于列出具有特定模式的标记。正在编辑答案。 - Zubair
10个回答

470

试着运行此代码,它将列出所有标签及其注释,并为每个标签提供9行消息:

git tag -n9

也可以使用

git tag -l -n9

如果需要列出特定的标签:

git tag -l -n9 v3.*

(例如,上面的命令将仅显示以"v3."开头的标签。)

-l,--list 列出名称与给定模式匹配的标签(如果未提供模式,则列出所有标签)。在没有参数的情况下运行"git tag"也会列出所有标签。模式是一个shell通配符(即,使用fnmatch(3)进行匹配)。可以给出多个模式;如果它们中任何一个匹配,则显示该标签。


6
只会打印每个注释的第一行。 - Paul Price
3
@Paul Price:只有您有一个注释,否则它会打印提交信息。同意这不是 the 答案。 - Ciro Santilli OurBigBook.com
3
根据文件说明,-l选项是用来过滤模式的。我不明白它在这里会有什么帮助。我有什么遗漏的吗? - still_dreaming_1
2
@INTPnerd 是的,在这里 -l 完全是多余的。 - Lambart
1
@P.MyerNore,你可能在使用奇怪的git版本或传递了额外的参数来执行超出此问题要求的操作。但是对于某些情况而言,需要使用-l选项是很好的。 - still_dreaming_1
显示剩余4条评论

170
git tag -n99
简短而简洁。这将列出每个标记注释/提交消息的最多99行。这是Git标记官方文档的链接
我现在认为,仅显示每个标记最多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,但让我们将其保存为不同的问题/答案。

4
这句话的意思是设置一个名为"tags"的Git别名,用于列出所有标签及其注释,其中"-n99"表示一次最多显示99个字符的注释。全局配置可以应用于当前用户的所有Git仓库。 - Iulian Onofrei
2
@IulianOnofrei,很好,我不知道git允许您定义别名。我意识到这是离题了,但我无法抗拒。这就是我现在正在使用的(放置在您的.bashrc或类似文件中):alias gtag='git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags | sort -V' - still_dreaming_1

28

Mark Longair的回答(使用git show)接近于问题所需。 但是,它还包括由标签指向的提交以及该提交的完整补丁。 由于提交可能与标签有些不相关(它只是尝试捕获标签的一个提交),因此可能不太理想。 我认为以下内容更好一些:

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

马克的git show没有显示与我的使用相关的补丁。他的命令中省略了-p或--patch选项,但为了完全确保跳过差异,可以使用:--no-patch选项。(在git v2.7.1/mac上) - AnneTheAgile
这是更安全的脚本编写方式,因为它使用了管道。 - undefined

17

使用 --format 选项

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

15

虽然不太美观,但您可以创建一个脚本或别名来执行以下操作:

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 - Shai Berger
1
@ShaiBerger:实际上,我不这么认为——我想我只是在考虑git tag是瓷器而git for-each-ref是管道工具,因此后者的输出对于脚本编写应该更加稳定。 - Mark Longair
根据这个答案,我使用 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`。 - LucG

12

仅显示最后一个标签的信息:

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

4
对于从谷歌搜索到此页面的任何其他人:如果您想要显示来自特定标签的信息,请使用以下命令:git cat-file -p <tag> | tail -n +6 - Kit Peters

6
您可以使用此命令显示标签消息。
git tag -n

-n选项用于显示消息。

6
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中的“字段名称”章节,了解更多信息。

1
如果您想要包含标签,可以使用以下命令: git tag -l --format='%(tag): %(contents)' - Robert Benson
更好的是,git tag -l --format="%(tag)"$'\n'"%(contents)" - AnrDaemon

2

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


0
以下命令可能会提供有关标签的更多相关信息。
git tag --format='%(refname:strip=2)%09%(creatordate:short)%09%(authorname)%09%(subject)' --sort=-creatordate

结果列表标签、日期、名称、一行简介:

R7.0 2023-06-28  John Doe  [APP]Modified for release
R6.5 2023-04-02  John Doe  [APP]Updated readme

要获取完整的消息,请将命令中的 subject 更改为 contents

格式为 '%(字段名)'. 例如,'%09' 是 '\t','%0a' 是 '\n',%(color:red) 等等。详细信息请参见

git help for-each-ref

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接