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

Luk*_*asz 43 regex tags git tagging find

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

有什么办法吗?

KAR*_*ván 52

我正在使用以下命令:

git describe --match "v[0-9]*" --abbrev=4 HEAD
Run Code Online (Sandbox Code Playgroud)

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

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

  • [`git describe` doc](https://git-scm.com/docs/git-describe)表示`--match`采用的是glob,而不是正则表达式. (6认同)
  • 如果你只想要标签使用带有`--abbrev = 0`的"短输出". (5认同)
  • 问题是要求找到与模式匹配的最后一个*标签*。所以我认为最后必须添加`--tags`。否则仅显示带注释的标签。 (3认同)
  • @CraigMcQueen 这是一个全局变量,这就是它起作用并过滤掉“v1.0.0”而不仅仅是“v1234”的原因。我添加了一个注释来澄清这一点。 (2认同)

小智 9

git tag -l -n v*
Run Code Online (Sandbox Code Playgroud)

  • 它列出了所有标签匹配标准.我只需要最后一个,所以git描述--match v*.无论如何,感谢提示作为标签和描述命令在git手册页上链接在一起. (2认同)

Von*_*onC 8

虽然单一模式--match "v[0-9]*"就足够了,但 Git 2.13(2017 年第 2 季度)将对此进行改进:

git describe”和“ git name-rev”已被教导采用多个引用名称模式来限制其命名输出所依据的一组引用,并且还学会了采用否定模式来命名不用于通过其“ ”--exclude选项进行命名的引用。

请参阅Jacob Keller ( )的提交 77d21f2提交 43f8080提交 96415b4提交 290be66提交 4a68748(2017 年 1 月 18 日)。(由Junio C Hamano 合并 -- --提交 1b32498中,2017 年 2 月 27 日)jacob-keller
gitster

您现在可以有多个匹配模式

--match <pattern>:
Run Code Online (Sandbox Code Playgroud)

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

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

现在您还有一个(或多个)排除模式

--exclude <pattern>::
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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*


Tob*_*ler 6

KARASZI Istvá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
Run Code Online (Sandbox Code Playgroud)
  • 如果您只想要最近的标签(即--abrev=0会实现什么),请附加| cut -d"-" -f1
  • 如果您不希望--long也输出包含零件的完全匹配标签的行为-0-hash,请| sed -e's/-0-.*$//'改为追加。

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

  • 对于我的用例(请参阅正则表达式),标签命名不一致(带或不带前缀),这很有帮助,并且只使用一次 git describe 的执行。`git 描述 --abbrev=0 --tags --match="*$(git tag | grep -E "^(releases?\/|v)?[0-9]+\.[0-9]+ \.[0-9]+$" | sed -E 's/.*([0-9]+\.[0-9]+\.[0-9]+)$/\1/' |排序-V -r | 头-n 1)"`。也许这有助于类似的进一步用例。 (2认同)

小智 5

同样使用 git describe 您可以获得最新的标签,而不仅仅是从 HEAD 访问:

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