ChatGPT解决这个技术问题 Extra ChatGPT

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

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

git tag -n5

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

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

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

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

Z
Zubair

试试这个,它将列出所有标签以及每个标签的注释和 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。
s
still_dreaming_1
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'
C
Community

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 上)
M
Mark Longair

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

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
А
Александр Туманов

使用 --format 选项

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

g
gaRex

仅最后一个标签消息:

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

对于来自谷歌的其他人:如果您想显示来自特定标签的消息:git cat-file -p <tag> | tail -n +6
E
Envek
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)"
a
agouge

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


P
Park JongBum

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