我在存储库中有一堆未注释的标签,我想弄清楚它们指向哪个提交。是否有只列出标签及其提交SHA的命令?签出标签并看着HEAD对我来说似乎有点费力。
更新资料
在回答之后,我意识到我真正想要的只是简单地查看导致该标签的历史,这git log <tagname>
已经足够了。
标记为答案的答案对于获取标记及其提交的列表很有用,这正是我所要求的。有了一些Shell骇客,我相信可以将其转换为SHA + Commit消息。
--dereference
我在存储库中有一堆未注释的标签,我想弄清楚它们指向哪个提交。是否有只列出标签及其提交SHA的命令?签出标签并看着HEAD对我来说似乎有点费力。
在回答之后,我意识到我真正想要的只是简单地查看导致该标签的历史,这git log <tagname>
已经足够了。
标记为答案的答案对于获取标记及其提交的列表很有用,这正是我所要求的。有了一些Shell骇客,我相信可以将其转换为SHA + Commit消息。
--dereference
Answers:
一种方法是使用git rev-list
。以下将输出标记指向的提交:
$ git rev-list -n 1 $TAG
~/.gitconfig
如果经常使用,可以将其添加为别名:
[alias]
tagcommit = rev-list -n 1
然后调用:
$ git tagcommit $TAG
git rev-parse <tag>
?还是git rev-list -1 <tag>
?
git rev-parse $TAG
返回标记对象的SHA1,而不是其指向的提交。git rev-list -1
虽然有效。
git rev-parse $TAG^{commit}
或git rev-parse $TAG^{}
取消引用带注释/签名的标签
git rev-list $TAG --max-count=1
git tag -a
或git tag -s
,然后git rev-parse <tag>
会给你一个的SHA-1 标签的对象本身,而git rev-list -1 <tag>
会给SHA-1的提交(修订)它指向,一样的git rev-parse <tag>^{commit}
。HTH。
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/packed-refs
或” 的语义.git/refs/tags/*
git tag --verbose
展示也有意义吗?
-d
标志以获取引用的提交(在第二行)。
git show-ref
在两种不同类型的标签上行为不同的事实并不明显,也不是常识。
只需使用 git show <tag>
但是,它也转储提交差异。要忽略这些差异,请使用git log -1 <tag>
。(感谢@DolphinDream和@demisx!)
git show <tag>
显示差异,而不是标签指向的提交。
git show
在屏幕上转储了很多不需要的东西。它掩盖了正在寻找的实际提交哈希。一个更好的命令是git log -1 [tag-name]
或者git log -1 --pretty=oneline [tag-name]
如果您想要一个班轮。
由于大约有4个几乎可以接受但又不同的答案,因此我将总结所有不同的标记皮肤的方法。
git rev-list -1 $TAG
(回答)。git rev-list
输出导致$TAG
类似于git log
但仅显示提交的SHA1的提交。将-1
输出限制为其指向的提交。
git show-ref --tags
(answer)将显示所有标记(本地标记和从远程获取的标记)及其SHA1。
git show-ref $TAG
(answer)将显示标签及其路径以及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
(回答),取决于标签是本地标签还是从远程获取。
采用
git rev-parse --verify <tag>^{commit}
(即使对于带注释的标记,它也会返回提交的SHA-1)。
git show-ref <tag>
如果<tag>
未注释,也将起作用。并且总是存在git for-each-ref
(有关详细信息,请参阅文档)。
git rev-parse <tag>~0
这种方法似乎也可以工作,并且不需要在Windows上进行特殊的转义(在这种情况下,需要四顶帽子(^)代替一顶)。后缀~<number>
给出了第<number>个父提交,因此~0
产生了提交本身。顺便说一句,^0
也是^{commit}
修订后缀的有效简写。
我也想知道“正确”的方法,但是与此同时,您可以这样做:
git show mytag | head -1
git show --oneline mytag | head -1
您还可以获得标签易于使用的更易理解的图片
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
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 mailing list,这是获取带有自动取消引用带注释标签的标签的提交哈希列表的方法:
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
这没有显示文件名,但是至少您对存储库有所了解。
cat .git/refs/tags/*
该目录中的每个文件都包含一个指向提交的提交SHA。
.git/packed-refs
确实有工作。
我也想知道正确的方法,但是您始终可以窥视以下任何一种方法:
$ cat .git/packed-refs
要么:
$ cat .git/refs/tags/*
git rev-list
。
如果您想查看标签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-ref
显示标签的内容,而不是仓库版本的内容。$ git show-ref test 08b9c774ab20e5bdb638638cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD现在位于c7f8831 ... $ git checkout 08b9c77 HEAD现在位于c7f8831 ...