KAR*_*ván 52
我正在使用以下命令:
git describe --match "v[0-9]*" --abbrev=4 HEAD
Run Code Online (Sandbox Code Playgroud)
如果您从上一个版本化标记开始对源代码树执行某些操作,它还将修改该版本.
请注意,这不是正则表达式,而是一个glob,但适用于提供的示例.
小智 9
git tag -l -n v*
Run Code Online (Sandbox Code Playgroud)
虽然单一模式--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*
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*$可能是可选的)。
小智 5
同样使用 git describe 您可以获得最新的标签,而不仅仅是从 HEAD 访问:
git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)