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