gpt4 book ai didi

git - 如何列出所有轻量级标签?

转载 作者:IT王子 更新时间:2023-10-29 01:28:50 27 4
gpt4 key购买 nike

我想列出我存储库中的所有轻量级标签;我能想到的最好的方法是将 git for-each-refgrepcut 结合起来,但看起来会很友好繁琐的...

(当我们讨论它时,我们不妨为带注释的标签谈论同样的事情:肯定有人最终会在某个时候对此感到疑惑。)

编辑:

轻量级 标签是指那些 引用标签对象的标签引用。 (换句话说,未注释的标签。)

最佳答案

所有轻量级标签都在 refs/tags/ 命名空间中,可以用例如:

git for-each-ref --format '%(refname:short)' refs/tags/

或:

git show-ref --tags

至于带注释的标签,嗯,这里的技巧——它也影响“轻量级”标签部分——是带注释的标签实际上是 git 存储库中的一个对象,但是,有一个轻量级的指向那个对象的标签,它让你可以通过它的标签名称找到带注释的标签。1所以它真的是一对东西:一个轻量级标签,加上在 repo 中注释的标签对象,这使得它“不是一个轻量级标签”,除了一个顽固的事实,即 同时也是一个轻量级标签!

因此,它归结为:找到所有轻量级标签,然后根据您想要的行为选择仅选择指向提交的标签或指向标签对象的标签,然后继续发出标记名称。

git-for-each-ref 文档中有一个很长的例子,在 --format 字符串中编写整个脚本并使用 eval 来执行它(或者您可以通过管道传输到 sh 来执行,但需要一个额外的进程)。我通常发现将 git for-each-ref 的输出通过管道传输到 while read ... 循环中更简单:

git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)' |
while read ty name; do [ $ty = commit ] && echo $name; done

打印所有 lightweight-only 标签。

比较:

git for-each-ref refs/tags/ --format '%(objecttype) %(refname:short)' |
while read ty name; do [ $ty = tag ] && echo $name; done

打印所有 annotated 标签(或更准确地说,“lightweight-that-are-annotated”标签)。

请注意,标签可以(可以想象——据我所知,目前还没有实际用例)指向提交或标签以外的其他内容;是否使用直接指向 treeblob 的标记来做某事取决于您。


1如果没有轻量级标签,您将无法使用名称 annotag 来引用带注释的标签 annotag——如果不通过至少,git fsck 用于查找悬挂对象的所有搜索工作。此外,如果删除轻量级标签,带注释的标签对象可能会被垃圾回收。您可以使一个标签对象指向另一个标签对象以将其保留在存储库中(即禁止 gc),而第二个标签对象无需外部名称,只要第一个标签对象具有外部名称即可。不过,这绝对是一件奇怪的事情。

有趣的是,注释标签的内部格式包含外部名称,因此可以使用此技术来保护“旧”注释标签,通过删除轻量级标签来 stash 它们,然后再恢复原始轻量级标签。不过,是否有人可以为此想出一个用途...:-)

关于git - 如何列出所有轻量级标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21031201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com