如何告诉哪个提交标签指向Git?

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

更新

我意识到,在我通过响应后,我实际上想要的是简单地查看引向标记的历史,对于git log <tagname>就足够了。

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

266888 次浏览

这里没有显示文件名,但至少您可以了解存储库。

cat .git/refs/tags/*

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

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

git show mytag | head -1

我也想知道正确的方法,但你总是可以窥视到:

$ cat .git/packed-refs

或者:

$ cat .git/refs/tags/*

一种方法是使用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

因此,使用在一般情况下工作的公认答案更安全

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

使用

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

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


如果<tag>没有注释,git show-ref <tag>也可以工作。并且总是有git for-each-ref(详见文档)。

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

另外,git show-ref --dereference TAG显示了使用添加的^{}指向的提交。

您还可以获得更容易理解的标签指向何处使用的图片

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

为了获得标签引用的提交的sha/哈希值(不是标签的sha):

git rev-list -1 <tag>

这个怎么样:

git log -1 $TAGNAME

git log -1 origin/$TAGNAME

Igor Zevaka:

总结

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

  1. git rev-list -1 $TAG (answer)。git rev-list输出指向$TAG的提交,类似于git log,但只显示提交的SHA1。-1将输出限制为它所指向的提交。

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

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

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

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

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

只需使用git show <tag>即可

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

这将得到当前的SHA1哈希值

简化提交哈希

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

提交哈希

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

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

git log --decorate=full

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

如果您想查看标记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) .....

所以我有一个发布文件夹的负载,这些文件夹可以从几个不同的回购点之一签出,可能是开发,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邮件列表中,有一种方法可以获得带有注释的标记的自动解引用的提交哈希列表:

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

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

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

简短的后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)'"

--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下的section。(git help tag声明“格式与git-for-each-ref"相同;”)

出租汽车司机的解决方案

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

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

git rev-list——no-walk = git rev-parse Git rev-parse [tag_name]