名称: 发布 描述: 使用语义版本和常规提交基于git历史更新变更日志和版本 允许工具: Bash, Read, Edit, Grep, Glob
准备发布
基于git历史、语义版本和常规提交自动更新CHANGELOG.md和版本文件。
指令
1. 阅读发布指南
阅读 RELEASING.md 以获取完整的发布过程和约定。
2. 确定上次发布
# 获取最新的版本标签
git describe --tags --abbrev=0
3. 收集自上次发布以来的提交
# 列出自上次标签以来的所有提交,排除之前版本更新提交
git log $(git describe --tags --abbrev=0)..HEAD --oneline --no-merges --grep="^chore: Bump version" --invert-grep
忽略任何 chore: Bump version to X.Y.Z 提交——这些是之前 /release 运行但尚未标记的产物。
4. 确定版本更新
分析提交类型(排除版本更新提交)以确定正确的版本更新:
- 任何页脚中的
BREAKING CHANGE或类型后的!→ 主版本 更新 - 任何
feat:提交 → 次版本 更新 - 只有
fix:、perf:或其他补丁级别提交 → 补丁 更新
如果没有面向用户的更改(只有 docs:、refactor:、test:、chore:、ci:、style:),通知用户没有可发布更改,并询问是否继续。
5. 为变更日志分类更改
根据RELEASING.md将提交映射到变更日志部分:
| 提交类型 | 变更日志部分 | 是否包含? |
|---|---|---|
feat: |
新增 | 是 |
fix: |
修复 | 是 |
BREAKING CHANGE |
更改 | 是 |
perf: |
更改 | 是 |
build: |
更改 | 仅当面向用户时 |
docs: |
— | 否 |
refactor: |
— | 否 |
test: |
— | 否 |
chore: |
— | 否 |
ci: |
— | 否 |
style: |
— | 否 |
编写人类可读的变更日志条目:
- 使用提交主题,但如有需要可重写以提高清晰度
- 移除提交类型前缀和作用域
- 以破折号开始每个条目,描述面向用户的更改
- 在适当时将相关提交分组到单个条目中
6. 更新 CHANGELOG.md
- 读取当前
CHANGELOG.md - 检查是否存在已存在的未标记版本部分(一个版本条目在
[Unreleased]上方,没有对应的git标签)。这发生在之前运行/release但尚未创建标签时。- 如果存在未标记版本部分:用新确定的版本和条目替换该整个部分(标题、日期和所有条目)。不要创建重复部分。
- 如果不存在未标记版本部分:在
[Unreleased]下方添加一个新版本部分,带有今天的日期。
- 填充分类的更改(新增、更改、修复、移除、安全——仅包括有条目的部分)
- 更新文件底部的比较链接:
- 更新
[Unreleased]链接以比较新版本到 HEAD - 添加/更新版本比较链接
- 更新
7. 更新版本文件
更新两个文件中的版本字符串(它们必须匹配):
version/version.go—Version常量cmd/version.go—Version变量
8. 验证构建
go build -o /tmp/git-flow main.go && /tmp/git-flow version
9. 提交
暂存并提交所有更改:
git add CHANGELOG.md version/version.go cmd/version.go
检查前一个提交是否已经是 chore: Bump version to ... 提交(来自先前的 /release 运行)。如果是,修改该提交而不是创建新提交:
# 如果前一个提交是版本更新:
git commit --amend -m "chore: Bump version to X.Y.Z"
# 否则创建新提交:
git commit -m "chore: Bump version to X.Y.Z"
10. 报告
向用户显示:
- 前一个版本 → 新版本
- 变更日志条目的摘要
- 提醒他们在准备就绪时推送和标记:
git push origin main git tag vX.Y.Z git push origin vX.Y.Z