我需要 Git 命令来获取/查找以'v'开头的最后一个标签以获取最后的版本控制提交(我正在使用开头带有 v 字母的标签来标记下一个应用程序版本(示例:v0.9.1beta)。
有什么办法吗?
使用以下命令:
git describe --tags --match="v[0-9]*" HEAD
如果您在上一个版本化标签后对源代码树做了一些事情,它也会修改版本。
注意:
--match
接受 glob,not 正则表达式,因此显示的命令可能匹配其他标签,例如v1234_this_matches_too
.
git tag -l -n v*
像其他答案一样使用
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*
还有 git describe 你可以获得最新的标签,而不仅仅是从 HEAD 获得:
git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)
KARASZI István 的回答 已经解释了如何找到与 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
的行为也输出 exactly 匹配的标签,包括 -0-hash
部分,请附加 | sed -e's/-0-.*$//'
代替。问题的示例标签可能会使用正则表达式
^v\d+\.\d+\.\d+\D*$
(尽管 \D*$
可能是可选的)。
虽然单个正则表达式
--match "v[0-9]*"
就足够了,但要知道 Git 2.13(2017 年第二季度)会改进它:
”和“git describe
”已被教导采用多个引用名称模式来限制引用集以其为基础 命名输出,并且还学会了采用负模式来 name refs 不用于通过他们的“git name-rev
”选项命名。--exclude
参见commit 77d21f2、commit 43f8080、commit 96415b4、commit 290be66、commit 4a68748(2017 年 1 月 18 日)作者:Jacob Keller(
jacob-keller
).gitster
-- 在 commit 1b32498,2017 年 2 月 27 日)
您现在可以拥有多重匹配模式:
--match <pattern>:
只考虑匹配给定
模式的标签,不包括“refs/tags/”前缀。glob(7)
这可用于避免从存储库中泄漏私有标记。如果多次给出,将累积一个模式列表,并考虑匹配任何模式的标签。
使用清除和重置模式列表。--no-match
你现在还有一个排除模式(或几个)!
--exclude <pattern>::
不考虑匹配给定
模式的标签,不包括 “refs/tags/”前缀。glob(7)
这可以用来缩小标签空间,只找到符合一些有意义的标准的标签。
如果多次给出,将累积一个模式列表,并排除匹配任何模式的标签。
当与组合时,如果标签匹配至少一个--match
模式并且不匹配任何--match
模式,则将被视为标签。--exclude
使用清除和重置模式列表。--no-exclude
git describe --match v*
用这个。
我用
git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"
git tag
将模式解释为 glob。所以你不能指定一个完整的正则表达式。只需使用最小的 glob (v*) 或什至根本不使用 glob。您将收到多个按排序顺序匹配的标签(最高标签版本在前),之后您将能够对输出进行正则表达式。
更复杂的是:
/v[0-9]+(\.[0-9]+).*/