git 如何获取当前提交的标签

cwtwac6a  于 2023-08-01  发布在  Git
关注(0)|答案(9)|浏览(189)

我有一个仓库,在同一个提交上有多个标签。举例来说:

commit #3 <--- TAG1 / TAG2 / TAG3

  |

commit #2 <--- TAG4/ TAG5

  |

commit #1 <--- TAG6/ TAG7

字符串
我想知道某个特定提交上有哪些标签。例如,如果我检查commit 1,我希望得到tag 6和tag 7。
我试过:

git checkout <commit 1> 
git tag --contains


其显示标签1-7。

git checkout <commit 1>
git describe --tags HEAD


仅显示标签6。
在Git中正确的方法是什么?

gudnpqoy

gudnpqoy1#

为了完成(感谢Ciro Santili的回答),git tag有一个选项--points-at,它完全按照OP的要求执行。

git tag --points-at HEAD

字符串
它并没有列出前向提交上的标签的效果(正如Jonathan Hartley在他关于git tag --contains的评论中所说的那样)。

vddsk6oq

vddsk6oq2#

我想也许git已经添加了一些选项,因为这个问题被问到了,但因为它在谷歌上仍然很高,我想我会补充说这种方式很好:

git tag -l --contains HEAD

字符串
或者将HEAD替换为您喜欢的任何其他有效提交引用。
如果HEAD包含任何标签,这将打印一个以换行符分隔的标签列表,否则不打印任何标签,所以你会得到:

TAG6
TAG7


当然,有很多很好的方法与各种其他shell工具,你可以格式化输出,一旦你有它…

bzzcjhmw

bzzcjhmw3#

对威廉的回答做了一些改进:

git config --global alias.tags 'log -n1 --pretty=format:%h%d'

字符串
输出如下所示:

~$ git tags
7e5eb8f (HEAD, origin/next, origin/master, origin/HEAD, master)
~$ git tags HEAD~6
e923eae (tag: v1.7.0)

gorkyyrv

gorkyyrv4#

第一个月
--points-at
仅列出给定对象的标签(如果未指定,则为HEAD)。意味着...名单。
https://git-scm.com/docs/git-tag

igsr9ssn

igsr9ssn5#

这并不理想,但可能有帮助:

$ git log -n 1 --decorate --pretty=oneline

字符串
你可以随意改变格式来得到你想要的。

u4dcyp6a

u4dcyp6a6#

这将显示HEAD的提交id,以及恰好位于HEAD的任何分支或标记。

git reflog --decorate -1

字符串
样品输出:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) HEAD@{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD

ntjbwcob

ntjbwcob7#

这里是@JoshLee回答的一个改进,它操纵输出只列出标签(不是分支,也不是HEAD),并删除单词“tag:”和装饰性标点符号。如果您正在编写脚本,需要查找当前标记(例如,把它们放在提示符中):

git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g"

字符串
示例输出:

$ git log -n 1 --decorate=short
commit a9313...c7f2 (HEAD, tag: v1.0.1, tag: uat, mybranch)
...
$ git log -n1 --pretty="format:%d" | sed "s/, /\n/g" | grep tag: | sed "s/tag: \|)//g"
v1.0.1
uat

ef1yzkbh

ef1yzkbh8#

我正在执行git tag -l | grep $(git describe HEAD),它返回最新提交的标记,或者如果最后一次提交没有标记,则不返回任何标记

vyswwuz2

vyswwuz29#

如果您使用的是git tag --points-at HEAD,请确保使用Git 2.42(Q3 2023)。
git tag --list --points-at X”(man)显示了直接引用对象X的标签,但没有列出指向这样一个标签的标签,这已经在Git 2.42(Q3 2023)中得到了纠正。
参见commit d9e0062commit 870eb53commit b9584c5(2023年7月2日)by Jeff King ( peff )
参见commit 468887f(2023年7月1日)by Jan Klötzke ( jkloetzke )
(由Junio C Hamano -- gitster --合并于commit 5929e66,2023年7月25日)

ref-filter:处理--points-at选项中的嵌套标记

签字人:扬·克勒茨克
标签被解除引用,直到到达不同的对象类型以处理嵌套标签,例如结账时。
相比之下,“git tag --points-at=...”(man)无法列出此类嵌套标记,因为在filter_refs()中仅获得一个间接级别。
在过滤引用时实现“--points-at“选项的递归解引用以统一行为。
这将列出嵌套的标记,并且这样做会更快:

ref-filter:避免解析match_points_at()中的标记对象

签字人:杰夫·金
当我们剥离标签以检查它们是否匹配--points-at oid时,我们递归地解析带标签的对象以查看它是否也是一个标签。
但是由于标记本身告诉我们它所指向的对象的类型(甚至通过它的“标记”成员给我们适当的对象结构),我们可以直接使用它。
我们仍然需要确保在查看每个标记之前调用parse_tag()
这对于最外面的标记来说是多余的(因为我们调用了parse_object()来查找它的类型),但这没关系; parse_tag()足够聪明,当标签已经被解析时,它会将此设置为noop。
在我克隆的linux.git中,有782个标签(只有3个非标签),这产生了显著的加速(让我们回到了提交之前的位置,在这个提交开始递归地解引用标签之前):

Benchmark 1: ./git.old for-each-ref --points-at=HEAD --format="%(refname)"
  Time (mean ± σ):      20.3 ms ±   0.5 ms    [User: 11.1 ms, System: 9.1 ms]
  Range (min … max):    19.6 ms …  21.5 ms    141 runs

Benchmark 2: ./git.new for-each-ref --points-at=HEAD --format="%(refname)"
  Time (mean ± σ):      11.4 ms ±   0.2 ms    [User: 6.3 ms, System: 5.0 ms]
  Range (min … max):    11.0 ms …  12.2 ms    250 runs

Summary
  './git.new for-each-ref --points-at=HEAD --format="%(refname)"' ran
    1.79 ± 0.05 times faster than './git.old for-each-ref --points-at=HEAD --format="%(refname)"'

字符串

相关问题