如何获得匹配正则表达式标准的最后一个Git标记

时间:2010-10-05 20:50:57

标签: regex git tags find tagging

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

有什么办法吗?

9 个答案:

答案 0 :(得分:48)

我正在使用以下命令:

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

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

请注意,这不是不是正则表达式,而是一个glob,但适用于提供的示例。

答案 1 :(得分:6)

git tag -l -n v*

答案 2 :(得分:4)

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-.*$//'而不是。

问题的示例代码可能会使用正则表达式^v\d+\.\d+\.\d+\D*$(尽管\D*$可能是可选的。)

答案 3 :(得分:3)

也可以使用git describe来获取最新的标签,而不仅仅是使用从HEAD获得:

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

答案 4 :(得分:2)

虽然单个正则表达式--match "v[0-9]*"就足够了,但是知道Git 2.13(2017年第二季度)会改善:

  

" git describe"和" git name-rev"已被教导采取多个refname模式来限制refs的基础   命名输出,并学习采取负面模式   name refs不能用于通过他们的" --exclude"选项。

commit 77d21f2点击commit 43f8080commit 96415b4commit 290be66commit 4a68748Jacob Keller (jacob-keller)(2017年1月18日)。{ Junio C Hamano -- gitster --于2017年2月27日commit 1b32498合并)

您现在可以拥有multiple match pattern

--match <pattern>:
  

仅考虑与给定glob(7)模式匹配的标记,不包括&#34; refs / tags /&#34;前缀。
  这可用于避免从存储库中泄漏私有标记。

     

如果多次给出,将累积一个模式列表,并且将考虑匹配任何模式的标签   使用--no-match清除并重置模式列表。

你还有一个exclude pattern (or several) now

--exclude <pattern>::
  

不要考虑与给定glob(7)模式匹配的标记,不包括       &#34; refs / tags /&#34;字首。

     

这可用于缩小标签空间,仅查找符合某些有意义标准的标签   如果多次给出,将累积模式列表,并且将排除匹配任何模式的标签   当与--match结合使用时,如果某个代码与至少一个--match模式匹配且与--exclude模式不匹配,则会考虑使用该标记。
  使用--no-exclude清除并重置模式列表。

答案 5 :(得分:1)

git describe --match v*

使用此功能。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

我用

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

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

答案 8 :(得分:0)

更复杂的事情是:

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