我在存储库中有一堆未注释的标记,我想知道它们指向哪个提交。是否有一个命令只列出标签及其提交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
即使这已经很老了,我想我会指出一个很酷的功能,我刚刚找到列出标签的提交:
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
这将获得当前的SHA1哈希值
缩写提交哈希
git show <tag> --format="%h" --> 42e646e
提交哈希
git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
我也想知道正确的方法,但你可以随时偷看:
$ cat .git/packed-refs
要么:
$ cat .git/refs/tags/*
如果你想看到标签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) .....
这不显示文件名,但至少你会感觉到存储库。
cat .git/refs/tags/*
该目录中的每个文件都包含一个指向提交的提交SHA。
从git mailing list,这里是获取带有注释标签的自动解除引用的标签的提交哈希列表的方法:
git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
所以我有一大堆发布文件夹,其中这些文件夹可以从几个不同的repos中检出,可能是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 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!)
在我的存储库中,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
(详见文档)。
来自Igor Zevaka:
由于大约有4个几乎同样可接受但又不同的答案,我将总结所有不同的方法来标记标签。
git rev-list -1 $TAG
(answer)。 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
(answer)取决于标签是本地的还是从遥控器取出的。这个怎么样:
git log -1 $TAGNAME
要么
git log -1 origin/$TAGNAME
为了获得标记引用的提交的sha / hash(不是标记的sha):
git rev-list -1 <tag>
我也想知道“正确”的方式,但与此同时,你可以这样做:
git show mytag | head -1