我需要Git命令获取/查找以'v'开头的最后一个标记以获得上次版本控制提交(我在开头使用带有v字母的标记来标记下一个应用程序版本(例如:v0.9.1beta )。
有什么办法吗?
答案 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 43f8080,commit 96415b4,commit 290be66,commit 4a68748,Jacob 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]+).*/