我在存储库中有一堆没有注释的标记,我想弄清楚它们指向哪个提交。是否有一个命令只列出标签和它们的提交sha ?检查标签和查看头部似乎有点太费力对我来说。

更新

在检查完响应后,我意识到我实际上想要的只是查看标记之前的历史记录,对于这一点git log <tagname>就足够了。

标记为answer的答案对于获取标记及其提交的列表很有用,这就是我所要求的。通过一点shell hack,我相信可以将这些转换为SHA+Commit消息。


当前回答

出租汽车司机的解决方案

解析.git/ packaged -refs并将其格式化为{tag}\t{sha}

sed -n '/ refs\/tags/ { s@\([^ ]*\) refs/tags/\(.*\)@\2\t\1@; p}' .git/packed-refs

其他回答

一种方法是使用git rev-list。下面将输出标签所指向的提交:

$ git rev-list -n 1 $TAG

注释标签和Unannotated标签都适用

您可以在~/中添加它作为别名。如果你经常使用Gitconfig:

[alias]
  tagcommit = rev-list -n 1

然后用:

$ git tagcommit $TAG

可能的陷阱:如果您有一个本地签出或具有相同标记名称的分支,这个解决方案可能会让您“警告:refname 'myTag'是不明确的”。在这种情况下,试着增加特异性,例如:

$ git rev-list -n 1 tags/$TAG

所以我有一个发布文件夹的负载,这些文件夹可以从几个不同的回购点之一签出,可能是开发,qa或主分支,也可能是生产版本,从一个标签签出,标签可能带注释,也可能没有。我有一个脚本,将查看目标文件夹,并在窗体返回答案-。问题是不同版本的git返回不同的标签签出状态。

所以我发现git show-ref——tags最初工作,除了带注释的标签。然而,添加-d将一个单独的条目添加到标记列表中,一个用于标记,另一个用于注释(注释提交被标识为^{},我用sed去掉了它)。

所以这是我剧本的核心,对于任何想要它的人:-

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

简短的后git -2回答

我知道这个问题已经提出很久了。CB Bailey的答案是100%正确的:git show-ref——tags——abbrev

我更喜欢这个,因为它使用了git标签:

git tag --list --format '%(refname:short) %(objectname:short)'

简单。短。

PS用这个命令将它别名为git标签列表:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

Git revlist -no-walk [tag_name]

format选项可用于显示标记散列和提交散列,并用于区分轻量级标记和带注释的标记。

git tag --format="%(color:bold cyan)== %(refname:short) ==%(if)%(object)%(then)%0aTag Hash: %(objectname)%0aTag Date: %(taggerdate:iso-local)%0a  Commit: %(object) %0a%0a%(contents)%(else)%0a(lightweight tag)%0a  Commit: %(objectname)%(end)%0a"

输出类似于:

== b2lightweight ==
(lightweight tag)
  Commit: 0450fae4352dbbbf088419757eda32711316a02e

== c3_annotated ==
Tag Hash: 19961d8678a09a319a9d6c398c79f27cc23d610c
Tag Date: 2021-08-06 15:18:48 -0600
  Commit: 85be6e80c109ce44d78f0ca0da8e1ec53817b24c

This is my tag message.

It has multiple lines.

Another line.

要定义为git别名,你可以使用git config——global -e编辑全局git配置,并添加以下内容:

[alias]
    tag-verbose = tag --format='%(color:bold cyan)== %(refname:short) ==%(if)%(object)%(then)%0aTag Hash: %(objectname)%0aTag Date: %(taggerdate:iso-local)%0a  Commit: %(object) %0a%0a%(contents)%(else)%0a(lightweight tag)%0a  Commit: %(objectname)%(end)%0a'

别名仍然允许过滤,例如。

C:\playground>git tag-verbose -l *b2*
== b2lightweight ==
(lightweight tag)
  Commit: 0450fae4352dbbbf088419757eda32711316a02e

有关——format选项的更多信息,请参阅git help For -each-ref下的“字段名称”部分。(git帮助标签声明“格式与git-for-each-ref相同”)