如何获取匹配正则表达式的最后一个Git标签
我需要Git命令来获取/查找以'v'开头的最后一个标签,以获取最新的版本提交(我在开头使用带有v字母的标签来标记下一个应用程序版本(例如:v0.9.1beta)。
有什么办法吗?
我为此使用以下命令:
git describe --match "v[0-9]*" --abbrev=4 HEAD
如果自上次版本标记以来对源树进行了某些操作,它还将修改版本。
请注意,这不是正则表达式,而是全局变量,但适用于所提供的示例。
git tag -l -n v*
KARASZIIstván的答案已经说明了如何找到与glob相匹配的标签,通常这已经足够了。 尽管您是否需要真正的RegEx:
for tag in $(git tag | grep YOURREGEX); do
git describe --tags --long --match="$tag" 2>/dev/null
done | sort -k2 -t"-" | head -n1
- 如果您只想要最接近的标签(即
^v\d+\.\d+\.\d+\D*$
可以实现),请附加\D*$
- 如果您不希望
^v\d+\.\d+\.\d+\D*$
也输出包含\D*$
部分的完全匹配标签的行为,请附加| sed -e's/-0-.*$//'
。
问题的示例标签可能会使用正则表达式^v\d+\.\d+\.\d+\D*$
(尽管\D*$
可能是可选的)。
另外,使用git describe,您不仅可以通过HEAD获得最新的标签,还可以:
git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)
虽然这里仅一个正则表达式--match
就足够了,但请知道Git 2.13(2017年第二季度)将改善:
“ 3006286091331818784”和“
--match
”已被教导采用多个引用名称模式来限制一组引用以其为基础 命名输出,还学会了采用负面模式 名称参考不得通过其“--match
”选项进行命名。
参见Jacob Keller(--match
)的提交77d21f2,提交43f8080,提交96415b4,提交290be66,提交4a68748(2017年1月18日)。
(由Junio C Hamano合并---match
-在2017年2月27日提交1b32498中)
您现在可以具有多个匹配模式:
--match <pattern>:
仅考虑与给定的
--match
模式匹配的标签,但不包括“ refs / tags /”前缀。
这可以用来避免从存储库中泄漏私有标签。如果多次给出,将累积模式列表,并考虑与任何模式匹配的标签。
使用--match
清除并重置模式列表。
而且您现在还有一个(或多个)排除模式!
--exclude <pattern>::
不要考虑与给定的
--match
模式匹配的标签,但不包括 “ refs / tags /”前缀。这可用于缩小标签空间,仅查找符合某些有意义条件的标签。
如果多次给出,则将累积模式列表,并且将排除与任何模式匹配的标签。
与--match
组合使用时,如果标签至少与一个--match
模式匹配,但与任何--exclude
模式都不匹配,则将考虑使用该标签。
使用--no-exclude
清除并重置模式列表。
git describe --match v*
用这个。
使用git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*
作为其他答案的问题是git describe
将向您显示可以从HEAD(或您指定的提交)访问的标签。
假设您有3个标签,分别为v1,v2和v3。 如果HEAD介于v2和v3之间,则git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*
将返回v2而不是v3。
如果您实际上需要最新的标签,则首先需要带注释的标签,因为轻量级标签没有日期元数据。
然后,此命令将执行此操作:
git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*
我用
git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"
git tag
将模式解释为glob。 因此,您不能指定完整的正则表达式。 只需使用最小的glob(v *)甚至根本不使用glob。 您将收到不只一个匹配标签(按排序顺序排列)(首先是最高标签版本),随后您将能够对输出进行正则表达式。
更复杂的是:
/v[0-9]+(\.[0-9]+).*/