我正在尝试查找与远程 git存储库中的给定标记位于同一提交的所有标记。如果可能的话,我不想克隆遥控器的本地副本。
例如,我有一个存储库,其中两个标记release/latest
和release/1.00
都指向同一个提交。因此,给定标记release/latest
我希望我的脚本返回release/1.00
。
我正在使用ls-remote
列出远程代码:
git ls-remote --tags gitolite@myserver.example.org:/base.git
此命令返回
ad759 refs/tags/release/1.00
0e9d0 refs/tags/release/1.00^{}
de388 refs/tags/release/latest
0e9d0 refs/tags/release/latest^{}
(我缩短了提交哈希以节省空间。)
我不知道如何解释这个:为什么每个标签有两行?哪个参考指向“真实”标签?我应该忽略^{}
后面没有的标签吗?
答案 0 :(得分:1)
以^{}
结尾的标签是git提交的实际(轻量级)标签;而没有这个后缀的是(PGP-)签名或注释。
在远程存储库中,您必须解析ls-remote
的输出,如下所示:
tags=$(git ls-remote --tags gitolite@myserver.example.org:/base.git)
REV=$(echo "$tags" | sed -n 's#\s*refs/tags/release/latest$##p')
echo "$tags" | sed -n "s#$REV\s*refs/tags/##p"
在本地(1.7.0)存储库中,您只需使用
即可git tag --points-at release/latest
在1.7.0之前,用远程解决方案中的git show-ref --tags -d
替换ls-remote。