如何获取匹配正则表达式的最后一个Git标签

我需要Git命令来获取/查找以'v'开头的最后一个标签,以获取最新的版本提交(我在开头使用带有v字母的标签来标记下一个应用程序版本(例如:v0.9.1beta)。

有什么办法吗?

Lukasz asked 2020-08-11T06:10:11Z
9个解决方案
51 votes

我为此使用以下命令:

git describe --match "v[0-9]*" --abbrev=4 HEAD

如果自上次版本标记以来对源树进行了某些操作,它还将修改版本。

请注意,这不是正则表达式,而是全局变量,但适用于所提供的示例。

KARASZI István answered 2020-08-11T06:10:25Z
8 votes
git tag -l -n v*
racerror answered 2020-08-11T06:10:42Z
4 votes

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*$可能是可选的)。

Tobias Kienzler answered 2020-08-11T06:11:17Z
3 votes

另外,使用git describe,您不仅可以通过HEAD获得最新的标签,还可以:

git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)

Barthelemy Pavy answered 2020-08-11T06:11:37Z
2 votes

虽然这里仅一个正则表达式--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清除并重置模式列表。

VonC answered 2020-08-11T06:13:02Z
1 votes
git describe --match v*

用这个。

Lukasz answered 2020-08-11T06:13:23Z
1 votes

使用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*

Joe Alcorn answered 2020-08-11T06:13:56Z
0 votes

我用

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"

git tag将模式解释为glob。 因此,您不能指定完整的正则表达式。 只需使用最小的glob(v *)甚至根本不使用glob。 您将收到不只一个匹配标签(按排序顺序排列)(首先是最高标签版本),随后您将能够对输出进行正则表达式。

Henning answered 2020-08-11T06:14:21Z
-1 votes

更复杂的是:

/v[0-9]+(\.[0-9]+).*/
Rowland Mtetezi answered 2020-08-11T06:14:41Z
translate from https://stackoverflow.com:/questions/3867619/how-to-get-last-git-tag-matching-regex-criteria