我希望 git 列出所有标签以及完整的注释或提交消息。这样的事情很接近:
git tag -n5
这正是我想要的,除了它只会显示标签消息的前 5 行。
我想我可以使用一个非常大的数字。我可以在这里使用的最高数字是多少?每台电脑都一样吗?
更新:我有很多时间来考虑这个问题,现在我认为如果其中一些非常长,我不一定要显示每条消息的全部内容。我真的没有任何特殊的需要需要我看到大量的消息(除了我自己倾向于在我写的所有内容中冗长,包括标签消息)。我只是不喜欢它不一定会向我展示整个信息的想法,因为这让我觉得它在向我隐藏信息。但是太多的信息也可能是一件坏事。
git tag -n
为我做的
git tag -n
仅打印注释的第一行。
试试这个,它将列出所有标签以及每个标签的注释和 9 行消息:
git tag -n9
也可以使用
git tag -l -n9
如果要列出特定标签:
git tag -l -n9 v3.*
(例如,上面的命令将只显示以“v3”开头的标签。)
-l , --list 列出名称与给定模式匹配的标签(如果没有给出模式,则全部列出)。不带参数运行“git tag”也会列出所有标签。该模式是一个shell 通配符(即,使用fnmatch(3) 匹配)。可以给出多种模式;如果其中任何一个匹配,则显示标签。
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'
alias gtag='git for-each-ref --format="%(refname:short) %(taggerdate) %(subject) %(body)" refs/tags | sort -V'
Mark Longair's answer(使用 git show
)接近问题中的期望值。但是,它还包括标记指向的提交,以及该提交的完整补丁。由于提交可能与标签无关(它只是标签试图捕获的一个提交),这可能是不可取的。我相信以下内容会更好一些:
for t in `git tag -l`; do git cat-file -p `git rev-parse $t`; done
它远非漂亮,但您可以创建一个脚本或别名来执行以下操作:
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
?
git tag
是瓷器,而 git for-each-ref
是管道,因此后者的输出对于脚本编写应该更稳定。
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)'
仅最后一个标签消息:
git cat-file -p $(git rev-parse $(git tag -l | tail -n1)) | tail -n +6
git cat-file -p <tag> | tail -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
“Field names” section 中查看更多信息。
git tag -l --format='%(tag): %(contents)'
git tag -l --format="%(tag)"$'\n'"%(contents)"
我更喜欢在命令行上执行此操作,但如果您不介意 Web 界面并且使用 GitHub,则可以访问 https://github.com/user/repo/tags
并单击每个标签旁边的“...”以显示其注释。
“git tag -n” 朱先生为这个答案做出了贡献。
不定期副业成功案例分享
-l
选项用于过滤模式。我看不出这在这里会有什么帮助。我错过了什么吗?-l
在这里完全是多余的