我在存储库中有一堆未注释的标签,我想弄清楚它们指向哪个提交。是否有一个命令只列出标签及其提交 SHA?检查标签并查看 HEAD 对我来说似乎有点太费力了。
更新
在浏览完回复后,我意识到我真正想要的是简单地查看导致标签的历史,这git log <tagname>
已经足够了。
标记为答案的答案对于获取标签列表及其提交很有用,这就是我所要求的。通过一些 shell hackery,我确信可以将它们转换为 SHA+Commit 消息。
一种方法是使用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
警告这仅适用于未注释的标签因此使用在一般情况下有效的公认答案更安全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
只需使用git show <tag>
但是,它也会转储提交差异。要省略这些差异,请使用git log -1 <tag>
. (感谢@DolphinDream 和@demisx!)
从伊戈尔泽瓦卡:
由于大约有 4 个几乎同样可以接受但不同的答案,我将总结所有不同的方式来给标签贴皮。
git rev-list -1 $TAG
(答案)。git rev-list
输出导致$TAG
类似于git log
但仅显示提交的 SHA1 的提交。将-1
输出限制为它指向的提交。
git show-ref --tags
( answer ) 将显示所有标签(本地标签和从远程获取的标签)及其 SHA1。
git show-ref $TAG
(答案)将显示标签及其路径以及 SHA1。
git rev-parse $TAG
( answer ) 将显示未注释标签的 SHA1。
git rev-parse --verify $TAG^{commit}
( answer ) 将显示带注释和未注释标签的 SHA1。在 Windows 上使用git rev-parse --verify %TAG%^^^^{commit}
(四顶帽子)。
cat .git/refs/tags/*
或cat .git/packed-refs
( answer ) 取决于标签是本地的还是从远程获取的。
对于带注释的标签,git show-ref TAG
显示标签的哈希,而不是它指向的提交的哈希。
git show-ref --dereference TAG
此外,还显示了带有添加的^{}
.
采用
git rev-parse --verify <tag>^{commit}
(即使对于带注释的标签也会返回提交的 SHA-1)。
git show-ref <tag>
如果<tag>
没有注释也可以工作。并且总是有git for-each-ref
(有关详细信息,请参阅文档)。
这个怎么样:
git log -1 $TAGNAME
或者
git log -1 origin/$TAGNAME
为了获取标签所指的提交的 sha/hash(不是标签的 sha):
git rev-list -1 <tag>
我也想知道“正确”的方式,但与此同时,你可以这样做:
git show mytag | head -1
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)'"
尽管这已经很老了,但我想我会指出我刚刚发现的一个很酷的功能,用于列出带有提交的标签:
git log --decorate=full
它将显示在提交时结束/开始的分支,以及提交的标签。
您还可以获得更易于解释的标签指向使用位置的图片
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
这不会显示文件名,但至少您对存储库有所了解。
cat .git/refs/tags/*
该目录中的每个文件都包含一个指向提交的提交 SHA。
从git mailing list,这是获取带有注释标签的自动取消引用的标签的提交哈希列表的方法:
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
该--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 的格式相同”)
我也想知道正确的方法,但您可以随时查看:
$ cat .git/packed-refs
或者:
$ cat .git/refs/tags/*
这将为您提供当前的 SHA1 哈希
缩写提交哈希
git show <tag> --format="%h" --> 42e646e
提交哈希
git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
如果您想查看标记 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) .....
所以我有很多发布文件夹,这些文件夹可能是从几个不同的存储库之一签出的,可能是 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
可以在下面使用,它会给出提交哈希
git show -s --format=%H <tag>^{commit}
如果需要缩写的提交哈希,git show -s --format=%h <tag>^{commit}
哈克解决方案
解析.git/packed-refs
并将其格式化为{tag}\t{sha}
sed -n '/ refs\/tags/ { s@\([^ ]*\) refs/tags/\(.*\)@\2\t\1@; p}' .git/packed-refs