2010-10-05 49 views
28

我需要Git命令到获取/查找最后一个标签'v'获得最后版本提交(我在开始时使用v字母标记标记下一个应用程序版本(例如:v0.9.1beta如何获得最后一个Git标签匹配正则表达式标准

有没有办法做到这一点

+1

可你只需要使用'混帐describe'? – Daenyth 2010-10-05 21:07:01

+0

是的.. git describe --match v *是我需要的。谢谢。 – Lukasz 2010-10-05 21:16:05

+1

有人可以编辑标题,因为这是不需要真正使用正则表达式。所有的答案都只是使用匹配和“glob”模式。谢谢。 – d4Rk 2014-11-28 13:57:05

回答

39

我使用下面的命令为这个:?

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

如果自上次版本化标记以来您对源代码树执行了某些操作,它也将修改版本。

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

+2

如果您只想使用“--abbrev = 0”的标签,使用“short output”。 – 2013-08-17 02:11:44

+3

['git describe' doc](https://git-scm.com/docs/git-describe)表示'--match'采用了glob,而不是正则表达式。 – 2016-10-28 04:51:49

+0

@CraigMcQueen是一个glob,这就是为什么它工作并过滤掉'v1.0.0'而不是'v1234'。我添加了一个注释来澄清这一点。 – 2016-10-28 07:36:36

4
git tag -l -n v* 
+2

它列出了所有标签匹配条件。我只需要最后一个,所以git描述--match v *。无论如何感谢提示标签和描述命令链接在一起的git手册页。 – Lukasz 2010-10-05 21:17:47

2
git describe --match v* 

使用此。

+1

这将包括所有以'v'开头的标签,所以它会列出所有字不只是版本 – 2010-10-05 21:21:24

+0

是的......这是真的。无论如何,我标记你的正则表达式是解决我的问题。我应该删除这个答案吗? – Lukasz 2010-10-06 00:21:52

+0

感谢您的接受!不,我认为不需要删除这个答案。 – 2010-10-06 08:42:33

0

我使用

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

git tag解释图案作为水珠。所以你不能指定一个完整的正则表达式。只需使用最小glob(v *)甚至不使用glob。您将以排序顺序(最高标记版本优先)获得多于一个匹配标记,然后您将能够将输出与之后的表达式进行正则表达式匹配。

3

KARASZI István's answer已经解释了如何找到与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的行为也输出,确切地说匹配标签包括-0-hash部分,而是附加| sed -e's/-0-.*$//'

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

+0

...虽然这在性能方面明显更差,因为'git describe'是为匹配RegEx的_each_标签运行的。 – 2017-02-09 08:22:33

+0

感谢这:) – 2017-02-27 18:42:38

2

虽然单个正则表达式--match "v[0-9]*"就够这里,知道了Git 2.13(Q2 2017)将改善是:

git describe”和“git name-rev”已经被教导要花费超过一个refname模式限制这组参考文件将其 命名输出作为基础,并且还学会了将 的负模式用于名称,因为名称不适用于通过它们的“--exclude”选项进行命名。

通过Jacob Keller (jacob-keller)参见commit 77d21f2commit 43f8080commit 96415b4commit 290be66commit 4a68748(2017年1月18日)。
(在commit 1b32498Junio C Hamano -- gitster --合并,2017年2月27日)

你现在可以有multiple match pattern

--match <pattern>: 

只考虑标签匹配给定glob(7)模式,不包括“裁判/标签/ “ 字首。
这可以用来避免从存储库泄漏专用标签。

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

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

--exclude <pattern>:: 

不考虑标签匹配给定glob(7)模式,不包括 的 “裁判/标签/” 前缀。

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

1

使用git describe为其他答案的问题做是git describe会告诉你,是从头部到达标签(或提交指定。)

想象一下,你有3个标签,V1,V2,和v3。如果HEAD位于v2和v3之间,则git describe将返回v2而不是v3。

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

然后,此命令将做到这一点:

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

相关问题