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

e5nqia27  于 2023-05-21  发布在  Git
关注(0)|答案(9)|浏览(121)

我需要Git命令来get/find以'v'开头的最后一个标签,以获取最后一次版本控制提交(我使用开头带有v字母的标签来标记下一个应用程序版本(示例:v0.9.1beta)。
有什么办法吗?

ogsagwnx

ogsagwnx1#

使用以下命令:

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

如果您在上一个版本化标记之后对源代码树执行了某些操作,它也会修改版本。

注意:--match接受glob,* 不接受 * regex,因此显示的命令可能匹配其他标记,例如v1234_this_matches_too

7lrncoxx

7lrncoxx3#

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

k75qkfdt

k75qkfdt4#

同样使用git describe,你可以获得最新的标签,而不仅仅是从HEAD获得:
git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)

5ssjco0h

5ssjco0h5#

KARASZI István's answer已经解释了如何找到与 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
  • 如果你只想要最近的标签(即--abrev=0将实现什么),追加| cut -d"-" -f1
  • 如果您不希望--long的行为也输出一个 * 完全 * 匹配的标记(包括-0-hash部分),则改为追加| sed -e's/-0-.*$//'

问题的示例标记可能会使用Regex ^v\d+\.\d+\.\d+\D*$(尽管\D*$可能是可选的)。

aydmsdu9

aydmsdu96#

虽然这里一个正则表达式--match "v[0-9]*"就足够了,但要知道Git 2.13(Q2 2017)将对此进行改进:
git describe”和“git name-rev”已经被教导采用多个refname模式来限制作为其命名输出基础的引用集,并且还学会了采用否定模式来命名不用于通过其“--exclude”选项命名的引用。
参见commit 77d21f2commit 43f8080commit 96415b4commit 290be66commit 4a68748(18 Jan 2017)by 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清除并重置模式列表。

js4nwp54

js4nwp547#

git describe --match v*

用这个。

wnrlj8wa

wnrlj8wa8#

我用

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

git tag将模式解释为glob。所以你不能指定一个完整的正则表达式。只需使用最小的glob(v*),甚至根本不使用glob。您将以排序顺序(最高标记版本优先)收到不止一个匹配标记,之后您将能够正则化输出。

lmyy7pcs

lmyy7pcs9#

更复杂的情况如下:

/v[0-9]+(\.[0-9]+).*/

相关问题