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


359

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

git tag -n5

这样做确实符合我的要求,只是它最多只会显示标记消息的前5行。

我想我只能使用很大的数字。我在这里可以使用的最高数字是多少?每台计算机上都一样吗?

更新:我已经花了很多时间考虑这个问题,现在我想如果其中一些消息过长,我不一定要显示每条消息的全部。我并没有真正需要查看大量消息的特殊需求(除了我自己倾向于在编写的所有内容(包括标记消息)中long之以鼻。我只是不喜欢这样的想法,即不一定要向我显示整个消息,因为这让我感到它正在向我隐藏信息。但是,过多的信息也可能是一件坏事。


62
git tag -n为我做了
Martin Berger 2013年

11
git tag -n根据联机帮助页,仅打印注释的第一行。
保罗·普赖斯

@INTPner,同意,-l标记用于列出具有特定模式的标记。编辑答案。
Zubair 2014年

Answers:


348

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

git tag -n9

也可以使用

git tag -l -n9

如果要列出特定标签:

git tag -l -n9 v3.*

(例如,上述命令将仅显示以“ v3”开头的标签。)

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


6
这只会打印每个注释的第一行。
保罗·普赖斯

3
@Paul Price:只有您有注释,否则它将打印提交消息。同意这是不是的答案。
Ciro Santilli郝海东冠状病六四事件法轮功

3
根据文档,-l选项是过滤模式。我看不出这对您有什么帮助。我想念什么吗?
still_dreaming_1 2014年

2
@INTPnerd是的,-l这里完全多余
Lambart 2014年

1
@ P.MyerNore您必须使用git的怪异版本或传递其他参数来执行比此问题要多的事情。但是很高兴知道在某些情况下需要-l。
still_dreaming_1 2015年

119
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,但是让我们将其保存用于其他问题/答案。


3
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'
still_dreaming_1

25

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

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

马克的git表演未显示我使用的补丁。他的命令省略了-p或--patch,但是要完全确定跳过差异,可以使用:--no-patch。(在git v2.7.1 / mac上)
AnneTheAgile

13

它远非漂亮,但您可以创建一个脚本或别名来执行以下操作:

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 2014年

@ShaiBerger:实际上,我不这么认为-我想我只是在想那git tag是瓷器,而且git for-each-ref是水管,所以后者的输出对于脚本编写应该更稳定。
Mark Longair 2014年

10

仅最后一个标记消息:

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

2
对于其他发生在Google上的人:如果您想显示来自特定标签的消息: git cat-file -p <tag> | tail -n +6
Kit Peters


2

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.