获取最后一个Git标签后的最早提交日期(跨平台)
跨平台高效获取Git标签后最早提交的作者日期
核心解决方案
要高效获取指定标签之后的最早提交的作者日期(%aI),且保证跨平台兼容(无需管道或shell特定语法),可以分两步执行Git命令:
获取目标标签之后的最早提交哈希
使用git rev-list反转提交顺序后取第一个提交,直接返回标签之后最早提交的哈希值:git rev-list --reverse --max-count=1 <tag_name>..HEAD参数说明:
--reverse:将提交顺序从默认的「最新到最早」反转成「最早到最新」--max-count=1:仅返回第一个(即最早的)提交哈希
根据哈希获取该提交的作者日期
用git show提取指定提交的作者日期:git show -s --format="%aI" <commit_hash>参数说明:
-s:仅显示提交摘要,不输出文件变更内容%aI:输出ISO 8601格式的作者日期,满足时间戳查询需求
合并获取最新标签与最早提交日期(Node.js/Execa实现)
如果需要自动获取最新发布标签并完成查询,在Execa中可以这样实现:
// 获取最新的发布标签 const lastTag = execa.sync('git', ['describe', '--abbrev=0', '--tags']).stdout.trim(); // 获取标签之后最早的提交哈希 const oldestCommitHash = execa.sync('git', ['rev-list', '--reverse', '--max-count=1', `${lastTag}..HEAD`]).stdout.trim(); // 获取该提交的作者日期 const oldestCommitDate = execa.sync('git', ['show', '-s', '--format=%aI', oldestCommitHash]).stdout.trim();
为什么之前的方案存在问题
git log -1 <tag>..HEAD --format="%aI":返回标签之后的最新提交,而非最早git log --reverse <tag>..HEAD --format="%aI" -1:Git会先取1个最新提交再执行反转,结果仍为最新提交- 带管道的
git log --reverse --format=%aI | head -n 1:依赖shell管道,Windows终端不兼容
关键细节说明
- 选择
%aI(作者日期)而非%cI(提交者日期):匹配需求中「提交作者登录名」的查询逻辑,避免PR合并时提交者与作者不一致的偏差 - 精准过滤范围:该方案获取的是标签之后实际提交到仓库的最早提交,即使PR创建早于标签但合并晚于标签,也能被正确纳入范围,解决了仅靠标签日期筛选的局限性
内容的提问来源于stack exchange,提问作者ghiscoding
相关产品推荐
相关产品推荐

