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

问题描述 投票:0回答:9

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

有什么办法吗?

regex git tags find tagging
9个回答
94
投票

使用以下命令:

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

如果您在上一个版本化标签后对源代码树做了一些事情,它也会修改版本。

注意:

--match
接受 glob,not 正则表达式,因此显示的命令可能匹配其他标签,例如
v1234_this_matches_too
.


16
投票
git tag -l -n v*

13
投票

像其他答案一样使用

git describe
的问题是
git describe
会向您显示可从HEAD(或您指定的提交)访问的标签。

假设您有 3 个标签,v1、v2 和 v3。如果 HEAD 位于 v2 和 v3 之间,

git describe
将返回 v2 而不是 v3。

如果你真的想要最新的标签,首先你需要带注释的标签,因为轻量级标签没有日期元数据。

然后这个命令会做:

git for-each-ref --sort=-taggerdate --count=1  refs/tags/v*


11
投票

还有 git describe 你可以获得最新的标签,而不仅仅是从 HEAD 获得:

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


6
投票

KARASZI István 的回答 已经解释了如何找到与 glob 匹配的标签,这通常就足够了。如果你需要一个真正的正则表达式:

for tag in $(git tag | grep YOURREGEX); do
    git describe --tags --long --match="$tag" 2>/dev/null
done | sort -k2 -t"-" | head -n1
  • 如果您只想要最近的标签(即
    --abrev=0
    会达到的效果),请附加
    | cut -d"-" -f1
  • 如果您不希望
    --long
    的行为也输出 exactly 匹配的标签,包括
    -0-hash
    部分,请附加
    | sed -e's/-0-.*$//'
    代替。

问题的示例标签可能会使用正则表达式

^v\d+\.\d+\.\d+\D*$
(尽管
\D*$
可能是可选的)。


6
投票

虽然单个正则表达式

--match "v[0-9]*"
就足够了,但要知道 Git 2.13(2017 年第二季度)会改进它:

git describe
”和“
git name-rev
”已被教导采用多个引用名称模式来限制引用集以其为基础 命名输出,并且还学会了采用负模式来 name refs 不用于通过他们的“
--exclude
”选项命名。

参见commit 77d21f2commit 43f8080commit 96415b4commit 290be66commit 4a68748(2017 年 1 月 18 日)作者:Jacob Keller(

jacob-keller 
).
(由 Junio C Hamano 合并 --
gitster
--
commit 1b32498,2017 年 2 月 27 日)

您现在可以拥有多重匹配模式

--match <pattern>:

只考虑匹配给定

glob(7)
模式的标签,不包括“refs/tags/”前缀。
这可用于避免从存储库中泄漏私有标记。

如果多次给出,将累积一个模式列表,并考虑匹配任何模式的标签。
使用

--no-match
清除和重置模式列表。

你现在还有一个排除模式(或几个)

--exclude <pattern>::

不考虑匹配给定

glob(7)
模式的标签,不包括 “refs/tags/”前缀。

这可以用来缩小标签空间,只找到符合一些有意义的标准的标签。
如果多次给出,将累积一个模式列表,并排除匹配任何模式的标签。
当与

--match
组合时,如果标签匹配至少一个
--match
模式并且不匹配任何
--exclude
模式,则将被视为标签。
使用
--no-exclude
清除和重置模式列表。


1
投票
git describe --match v*

用这个。


0
投票

我用

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

git tag
将模式解释为 glob。所以你不能指定一个完整的正则表达式。只需使用最小的 glob (v*) 或什至根本不使用 glob。您将收到多个按排序顺序匹配的标签(最高标签版本在前),之后您将能够对输出进行正则表达式。


-4
投票

更复杂的是:

/v[0-9]+(\.[0-9]+).*/
© www.soinside.com 2019 - 2024. All rights reserved.