如何列出指定日期后匹配指定模式的Git标签?
解决Git筛选指定模式+日期后标签的问题
你之前试的两个命令其实都只实现了一半需求:第一个能匹配linux*标签但完全没生效日期筛选,第二个能抓近一个月的标签却忽略了模式匹配。问题出在git rev-parse和git rev-list的参数逻辑上——前者不会处理--since这类日期筛选参数,后者的标签模式匹配写法没结合好,而且默认是按提交时间筛选,不是标签的创建时间。
下面给你两个精准的解决方案,按需选择:
方案1:按标签创建时间筛选(推荐)
这个方法直接针对标签的创建时间,用git for-each-ref(专门遍历引用的工具)同时实现模式匹配和日期筛选,结果准确且高效:
# 先查看符合条件的标签列表(带创建时间) git for-each-ref --sort=creatordate --format '%(refname:short) %(creatordate)' refs/tags/linux* --since='1 month ago' # 如果要直接查看标签的详细信息,用这个命令 git show --quiet $(git for-each-ref --format='%(refname:short)' refs/tags/linux* --since='1 month ago')
命令解释:
refs/tags/linux*:精准匹配所有以linux开头的标签--since='1 month ago':只保留创建时间在1个月以内的标签--format='%(refname:short)':只输出标签的短名称(比如linux-6.5而不是refs/tags/linux-6.5)
方案2:按标签指向的提交时间筛选
如果你想筛选的是标签对应的提交在1个月内(而非标签本身的创建时间),可以用这个循环检查的方式:
git tag -l "linux*" | while read tag; do # 检查当前标签的提交是否在1个月内 if git log -1 --format="%ad" "$tag" --since="1 month ago" >/dev/null; then echo "符合条件的标签:$tag" # 如需查看标签详情,取消下面的注释 # git show --quiet "$tag" fi done
为什么之前的命令失效?
- 第一个命令里的
git rev-parse --tags="linux*" --since="1 month":rev-parse的作用是解析引用,根本不支持--since参数,所以日期筛选完全没生效,自然会列出所有linux*标签。 - 第二个命令的
git rev-list --tags="linux*" --since="1 month":这里的--tags="linux*"写法有问题,而且rev-list是遍历标签指向的提交,--since筛选的是提交时间,不是标签创建时间,同时如果仓库里近一个月有其他非linux*标签的提交,也会被拉进来,导致结果不符合预期。
内容的提问来源于stack exchange,提问作者Patryk
相关产品推荐
相关产品推荐

