487

我在存储库中有一堆未注释的标签,我想弄清楚它们指向哪个提交。是否有一个命令只列出标签及其提交 SHA?检查标签并查看 HEAD 对我来说似乎有点太费力了。

更新

在浏览完回复后,我意识到我真正想要的是简单地查看导致标签的历史,这git log <tagname>已经足够了。

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

4

21 回答 21

433

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

$ git rev-list -n 1 $TAG

注意这适用于带注释和未注释的标签

如果您经常使用它,可以将其添加为别名~/.gitconfig

[alias]
  tagcommit = rev-list -n 1

然后调用它:

$ git tagcommit $TAG

可能的陷阱:如果您有本地结帐或具有相同标签名称的分支,此解决方案可能会给您“警告:refname 'myTag' is ambiguous ”。在这种情况下,请尝试增加特异性,例如:

$ git rev-list -n 1 tags/$TAG
于 2009-12-07T20:07:27.177 回答
272

警告这仅适用于未注释的标签因此使用在一般情况下有效的公认答案更安全https://stackoverflow.com/a/1862542/1586965

git show-ref --tags

例如,git show-ref --abbrev=7 --tags将显示如下内容:

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2
于 2009-12-07T22:01:50.187 回答
117

只需使用git show <tag>

但是,它也会转储提交差异。要省略这些差异,请使用git log -1 <tag>. (感谢@DolphinDream 和@demisx!)

于 2014-07-28T11:02:47.060 回答
49

伊戈尔泽瓦卡

概括

由于大约有 4 个几乎同样可以接受但不同的答案,我将总结所有不同的方式来给标签贴皮。

  1. git rev-list -1 $TAG答案)。git rev-list输出导致$TAG类似于git log但仅显示提交的 SHA1 的提交。将-1输出限制为它指向的提交。

  2. git show-ref --tags( answer ) 将显示所有标签(本地标签和从远程获取的标签)及其 SHA1。

  3. git show-ref $TAG答案)将显示标签及其路径以及 SHA1。

  4. git rev-parse $TAG( answer ) 将显示未注释标签的 SHA1。

  5. git rev-parse --verify $TAG^{commit}( answer ) 将显示带注释和未注释标签的 SHA1。在 Windows 上使用git rev-parse --verify %TAG%^^^^{commit}(四顶帽子)。

  6. cat .git/refs/tags/*cat .git/packed-refs( answer ) 取决于标签是本地的还是从远程获取的。

于 2014-06-28T17:06:50.103 回答
42

对于带注释的标签,git show-ref TAG显示标签的哈希,而不是它指向的提交的哈希。

git show-ref --dereference TAG此外,还显示了带有添加的^{}.

于 2010-08-24T06:44:41.737 回答
35

采用

git rev-parse --verify <tag>^{commit}

(即使对于带注释的标签也会返回提交的 SHA-1)。


git show-ref <tag>如果<tag>没有注释也可以工作。并且总是有git for-each-ref(有关详细信息,请参阅文档)。

于 2009-12-07T23:54:41.690 回答
15

这个怎么样:

git log -1 $TAGNAME

或者

git log -1 origin/$TAGNAME
于 2014-06-28T11:53:50.767 回答
12

为了获取标签所指的提交的 sha/hash(不是标签的 sha):

git rev-list -1 <tag>

于 2013-10-16T00:35:53.610 回答
9

我也想知道“正确”的方式,但与此同时,你可以这样做:

git show mytag | head -1    
于 2009-12-07T19:51:13.023 回答
9

Git-2 后的简短回答

我知道这个问题已经存在了很长一段时间。CB Bailey 的回答是 100% 正确的:git show-ref --tags --abbrev

我更喜欢这个,因为它使用git tag

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

简单的。短的。

PS 将它的别名git taglist与此命令一样:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"
于 2020-03-25T11:09:58.497 回答
7

尽管这已经很老了,但我想我会指出我刚刚发现的一个很酷的功能,用于列出带有提交的标签:

git log --decorate=full

它将显示在提交时结束/开始的分支,以及提交的标签。

于 2016-11-04T19:42:33.113 回答
5

您还可以获得更易于解释的标签指向使用位置的图片

git log --graph |git name-rev --stdin --tags |less

然后通过 滚动到您要查找的标签/

更紧凑的视图 ( --pretty=oneline) 加上所有的头 ( -a) 也可以帮助:

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

看起来有点吓人,但~/.gitconfig如果有必要也可以化名。

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
于 2012-06-14T13:04:15.117 回答
3

这不会显示文件名,但至少您对存储库有所了解。

cat .git/refs/tags/*

该目录中的每个文件都包含一个指向提交的提交 SHA。

于 2009-12-07T19:50:48.173 回答
3

git mailing list,这是获取带有注释标签的自动取消引用的标签的提交哈希列表的方法:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
于 2017-11-23T03:59:17.437 回答
3

--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 配置git config --global -e并添加以下内容:

[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 help tag声明“格式与 git-for-each-ref 的格式相同”)

于 2021-08-06T21:48:02.947 回答
2

我也想知道正确的方法,但您可以随时查看:

$ cat .git/packed-refs 

或者:

$ cat .git/refs/tags/*
于 2009-12-07T19:51:29.060 回答
2

这将为您提供当前的 SHA1 哈希

缩写提交哈希

git show <tag> --format="%h" --> 42e646e

提交哈希

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
于 2016-03-29T13:47:52.200 回答
2

如果您想查看标记 SOMETAG(标记器、日期等)的详细信息,它指向的提交的哈希值以及有关提交的一些信息但没有完整的差异,请尝试

git show --name-status SOMETAG

示例输出:

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....
于 2017-02-08T17:19:46.263 回答
0

所以我有很多发布文件夹,这些文件夹可能是从几个不同的存储库之一签出的,可能是 dev、qa 或 master 分支,也可能是生产版本,从标签签出,标签可能是注释与否。我有一个脚本,它将查看目标文件夹并以 - 形式返回答案。问题是不同版本的 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
于 2017-05-16T11:48:38.463 回答
0

可以在下面使用,它会给出提交哈希
git show -s --format=%H <tag>^{commit}

如果需要缩写的提交哈希,git show -s --format=%h <tag>^{commit}

于 2018-09-04T05:09:19.297 回答
0

哈克解决方案

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

sed -n '/ refs\/tags/ { s@\([^ ]*\) refs/tags/\(.*\)@\2\t\1@; p}' .git/packed-refs
于 2022-01-04T15:08:46.017 回答