@zjex/git-workflow 0.2.24 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/deploy-docs.yml +68 -0
- package/.github/workflows/test.yml +24 -4
- package/.husky/pre-commit +17 -0
- package/README.md +72 -1066
- package/ROADMAP.md +275 -0
- package/dist/index.js +450 -99
- package/docs/.vitepress/cache/deps/_metadata.json +52 -0
- package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js +9719 -0
- package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js.map +7 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
- package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
- package/docs/.vitepress/cache/deps/package.json +3 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1352 -0
- package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1665 -0
- package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js +1813 -0
- package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
- package/docs/.vitepress/cache/deps/vue.js +347 -0
- package/docs/.vitepress/cache/deps/vue.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-2CLQ7TTZ.js +9719 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-2CLQ7TTZ.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-LE5NDSFD.js +12824 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-LE5NDSFD.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/package.json +3 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vue_devtools-api.js +4505 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vue_devtools-api.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_core.js +583 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_core.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_integrations_useFocusTrap.js +1352 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___mark__js_src_vanilla__js.js +1665 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___mark__js_src_vanilla__js.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___minisearch.js +1813 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___minisearch.js.map +7 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vue.js +347 -0
- package/docs/.vitepress/cache/deps_temp_44e2fb0f/vue.js.map +7 -0
- package/docs/.vitepress/config.ts +167 -0
- package/docs/.vitepress/theme/custom.css +39 -0
- package/docs/.vitepress/theme/index.ts +4 -0
- package/docs/README.md +82 -0
- package/docs/commands/branch.md +468 -0
- package/docs/commands/commit.md +554 -0
- package/docs/commands/config.md +346 -0
- package/docs/commands/index.md +312 -0
- package/docs/commands/interactive.md +384 -0
- package/docs/commands/release.md +300 -0
- package/docs/commands/stash.md +309 -0
- package/docs/commands/tag.md +278 -0
- package/docs/commands/update.md +347 -0
- package/docs/config/ai-config.md +160 -0
- package/docs/config/branch-config.md +133 -0
- package/docs/config/commit-config.md +185 -0
- package/docs/config/config-file.md +776 -0
- package/docs/config/examples.md +279 -0
- package/docs/config/index.md +478 -0
- package/docs/features/git-wrapped.md +199 -0
- package/docs/guide/ai-commit.md +576 -0
- package/docs/guide/basic-usage.md +522 -0
- package/docs/guide/best-practices.md +426 -0
- package/docs/guide/branch-management.md +712 -0
- package/docs/guide/getting-started.md +294 -0
- package/docs/guide/index.md +168 -0
- package/docs/guide/installation.md +449 -0
- package/docs/guide/release-management.md +744 -0
- package/docs/guide/stash-management.md +608 -0
- package/docs/guide/tag-management.md +614 -0
- package/docs/index.md +205 -0
- package/docs/public/favicon.svg +21 -0
- package/docs/public/hero-logo.svg +43 -0
- package/docs/public/logo.svg +20 -0
- package/package.json +12 -2
- package/scripts/publish.js +55 -8
- package/scripts/publish.sh +20 -2
- package/scripts/release.sh +81 -3
- package/scripts/update-test-count.js +55 -0
- package/src/ai-service.ts +107 -15
- package/src/commands/commit.ts +4 -0
- package/src/commands/init.ts +18 -0
- package/src/commands/log.ts +503 -0
- package/src/config.ts +1 -0
- package/src/index.ts +37 -13
- package/src/utils.ts +10 -0
- package/tests/ai-service.test.ts +237 -2
- package/tests/init.test.ts +582 -0
- package/tests/log.test.ts +106 -0
- package/tests/release.test.ts +333 -0
- package/tests/setup.ts +21 -0
- package/tests/stash.test.ts +376 -0
- package/tests/update.test.ts +402 -0
- package/vitest.config.ts +3 -0
- package/zjex-logo.svg +22 -0
- package/zjex-optimized.svg +34 -0
- package/zjex.svg +1 -0
- package/src/commands/help.ts +0 -76
|
@@ -0,0 +1,744 @@
|
|
|
1
|
+
# 版本发布管理
|
|
2
|
+
|
|
3
|
+
版本发布管理是软件开发生命周期的重要环节,Git Workflow 提供了自动化的版本号管理和发布流程。
|
|
4
|
+
|
|
5
|
+
## 📦 版本发布理念
|
|
6
|
+
|
|
7
|
+
### 语义化版本控制
|
|
8
|
+
|
|
9
|
+
Git Workflow 遵循 [Semantic Versioning](https://semver.org/lang/zh-CN/) 规范:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
主版本号.次版本号.修订号[-预发布版本]
|
|
13
|
+
|
|
14
|
+
例如:1.2.3-beta.1
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**版本递增规则:**
|
|
18
|
+
- **主版本号(Major)** - 不兼容的 API 修改
|
|
19
|
+
- **次版本号(Minor)** - 向下兼容的功能性新增
|
|
20
|
+
- **修订号(Patch)** - 向下兼容的问题修正
|
|
21
|
+
- **预发布版本** - alpha, beta, rc
|
|
22
|
+
|
|
23
|
+
### 自动化版本管理
|
|
24
|
+
|
|
25
|
+
- **智能版本检测** - 自动读取 package.json 中的当前版本
|
|
26
|
+
- **版本递增建议** - 根据当前版本提供合理的递增选项
|
|
27
|
+
- **文件同步更新** - 自动更新 package.json 和相关文件
|
|
28
|
+
- **Git 集成** - 可选择同时创建 Git 标签
|
|
29
|
+
|
|
30
|
+
## 🚀 基本用法
|
|
31
|
+
|
|
32
|
+
### 更新版本号
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
gw r
|
|
36
|
+
# 或使用别名
|
|
37
|
+
gw release
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 版本选择界面
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
gw r
|
|
44
|
+
当前版本: 0.2.24
|
|
45
|
+
? 选择新版本:
|
|
46
|
+
❯ patch → 0.2.25
|
|
47
|
+
minor → 0.3.0
|
|
48
|
+
major → 1.0.0
|
|
49
|
+
alpha → 0.2.25-alpha.1
|
|
50
|
+
beta → 0.2.25-beta.1
|
|
51
|
+
rc → 0.2.25-rc.1
|
|
52
|
+
custom → 自定义版本号
|
|
53
|
+
|
|
54
|
+
✔ 版本号已更新: 0.2.24 → 0.2.25
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 版本更新结果
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
✔ 版本号已更新: 0.2.24 → 0.2.25
|
|
61
|
+
|
|
62
|
+
更新的文件:
|
|
63
|
+
package.json
|
|
64
|
+
package-lock.json (如果存在)
|
|
65
|
+
|
|
66
|
+
建议的后续操作:
|
|
67
|
+
1. 提交版本更新: gw c
|
|
68
|
+
2. 创建版本标签: gw t
|
|
69
|
+
3. 推送到远程: git push origin main --tags
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## 🎯 版本类型详解
|
|
73
|
+
|
|
74
|
+
### 正式版本
|
|
75
|
+
|
|
76
|
+
#### Patch 版本(修订号)
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# 当前版本: 1.2.3
|
|
80
|
+
gw r
|
|
81
|
+
# 选择: patch → 1.2.4
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**适用场景:**
|
|
85
|
+
- Bug 修复
|
|
86
|
+
- 安全补丁
|
|
87
|
+
- 文档更新
|
|
88
|
+
- 依赖版本更新(无功能影响)
|
|
89
|
+
|
|
90
|
+
**示例变更:**
|
|
91
|
+
```bash
|
|
92
|
+
# Bug 修复
|
|
93
|
+
🐛 fix(auth): 修复登录验证失败问题
|
|
94
|
+
🐛 fix(api): 修复数据获取超时问题
|
|
95
|
+
|
|
96
|
+
# 安全补丁
|
|
97
|
+
🔒 security: 修复 XSS 漏洞
|
|
98
|
+
🔒 security: 更新依赖修复安全问题
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Minor 版本(次版本号)
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# 当前版本: 1.2.3
|
|
105
|
+
gw r
|
|
106
|
+
# 选择: minor → 1.3.0
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**适用场景:**
|
|
110
|
+
- 新功能添加
|
|
111
|
+
- API 扩展(向下兼容)
|
|
112
|
+
- 性能改进
|
|
113
|
+
- 新的配置选项
|
|
114
|
+
|
|
115
|
+
**示例变更:**
|
|
116
|
+
```bash
|
|
117
|
+
# 新功能
|
|
118
|
+
✨ feat(dashboard): 添加用户仪表板功能
|
|
119
|
+
✨ feat(api): 添加数据导出接口
|
|
120
|
+
|
|
121
|
+
# API 扩展
|
|
122
|
+
✨ feat(config): 添加新的配置选项
|
|
123
|
+
⚡️ perf(query): 优化数据库查询性能
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
#### Major 版本(主版本号)
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 当前版本: 1.2.3
|
|
130
|
+
gw r
|
|
131
|
+
# 选择: major → 2.0.0
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**适用场景:**
|
|
135
|
+
- 破坏性 API 变更
|
|
136
|
+
- 架构重构
|
|
137
|
+
- 移除废弃功能
|
|
138
|
+
- 不向下兼容的更改
|
|
139
|
+
|
|
140
|
+
**示例变更:**
|
|
141
|
+
```bash
|
|
142
|
+
# 破坏性变更
|
|
143
|
+
💥 BREAKING CHANGE: 重构用户认证 API
|
|
144
|
+
💥 BREAKING CHANGE: 移除废弃的 v1 接口
|
|
145
|
+
|
|
146
|
+
# 架构重构
|
|
147
|
+
♻️ refactor: 重构整体架构,不兼容旧版本
|
|
148
|
+
🗑️ remove: 移除废弃的配置选项
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 预发布版本
|
|
152
|
+
|
|
153
|
+
#### Alpha 版本
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
# 当前版本: 1.2.3
|
|
157
|
+
gw r
|
|
158
|
+
# 选择: alpha → 1.2.4-alpha.1
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**特点:**
|
|
162
|
+
- 内部测试版本
|
|
163
|
+
- 功能可能不完整
|
|
164
|
+
- 可能存在已知问题
|
|
165
|
+
- 不建议生产环境使用
|
|
166
|
+
|
|
167
|
+
**使用场景:**
|
|
168
|
+
- 早期功能预览
|
|
169
|
+
- 内部团队测试
|
|
170
|
+
- 概念验证
|
|
171
|
+
|
|
172
|
+
#### Beta 版本
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# 当前版本: 1.2.4-alpha.3
|
|
176
|
+
gw r
|
|
177
|
+
# 选择: beta → 1.2.4-beta.1
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**特点:**
|
|
181
|
+
- 功能基本完整
|
|
182
|
+
- 面向更广泛的测试
|
|
183
|
+
- 可能存在少量问题
|
|
184
|
+
- 接近最终发布版本
|
|
185
|
+
|
|
186
|
+
**使用场景:**
|
|
187
|
+
- 公开测试
|
|
188
|
+
- 用户反馈收集
|
|
189
|
+
- 性能测试
|
|
190
|
+
|
|
191
|
+
#### RC 版本(Release Candidate)
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# 当前版本: 1.2.4-beta.2
|
|
195
|
+
gw r
|
|
196
|
+
# 选择: rc → 1.2.4-rc.1
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**特点:**
|
|
200
|
+
- 候选发布版本
|
|
201
|
+
- 功能冻结
|
|
202
|
+
- 仅修复关键问题
|
|
203
|
+
- 准备正式发布
|
|
204
|
+
|
|
205
|
+
**使用场景:**
|
|
206
|
+
- 最终测试
|
|
207
|
+
- 生产环境验证
|
|
208
|
+
- 发布前确认
|
|
209
|
+
|
|
210
|
+
### 自定义版本号
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
gw r
|
|
214
|
+
? 选择新版本:
|
|
215
|
+
❯ custom → 自定义版本号
|
|
216
|
+
|
|
217
|
+
? 输入自定义版本号: 2.0.0-beta.1
|
|
218
|
+
✔ 版本号已更新: 1.2.3 → 2.0.0-beta.1
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**使用场景:**
|
|
222
|
+
- 特殊版本命名需求
|
|
223
|
+
- 跳跃式版本更新
|
|
224
|
+
- 与现有版本体系对齐
|
|
225
|
+
|
|
226
|
+
## 🔄 完整发布流程
|
|
227
|
+
|
|
228
|
+
### 标准发布流程
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
# 1. 完成开发和测试
|
|
232
|
+
gw c # 最后的代码提交
|
|
233
|
+
|
|
234
|
+
# 2. 更新版本号
|
|
235
|
+
gw r
|
|
236
|
+
# 选择合适的版本类型
|
|
237
|
+
|
|
238
|
+
# 3. 提交版本更新
|
|
239
|
+
gw c
|
|
240
|
+
# AI 生成: 🔖 chore: 发布版本 v1.3.0
|
|
241
|
+
|
|
242
|
+
# 4. 创建版本标签
|
|
243
|
+
gw t
|
|
244
|
+
# 创建对应的 Git 标签
|
|
245
|
+
|
|
246
|
+
# 5. 推送到远程
|
|
247
|
+
git push origin main --tags
|
|
248
|
+
|
|
249
|
+
# 6. 发布到包管理器(如果适用)
|
|
250
|
+
npm publish
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 预发布测试流程
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# 1. 创建 alpha 版本
|
|
257
|
+
gw r
|
|
258
|
+
# 选择: alpha → 1.3.0-alpha.1
|
|
259
|
+
|
|
260
|
+
gw c # 提交版本更新
|
|
261
|
+
gw t # 创建标签
|
|
262
|
+
|
|
263
|
+
# 2. 内部测试,发现问题后修复
|
|
264
|
+
gw c # 提交修复
|
|
265
|
+
|
|
266
|
+
# 3. 递增 alpha 版本
|
|
267
|
+
gw r
|
|
268
|
+
# 选择: alpha → 1.3.0-alpha.2
|
|
269
|
+
|
|
270
|
+
# 4. 测试通过,升级到 beta
|
|
271
|
+
gw r
|
|
272
|
+
# 选择: beta → 1.3.0-beta.1
|
|
273
|
+
|
|
274
|
+
# 5. 公开测试,收集反馈
|
|
275
|
+
# 修复问题,递增 beta 版本...
|
|
276
|
+
|
|
277
|
+
# 6. 创建 RC 版本
|
|
278
|
+
gw r
|
|
279
|
+
# 选择: rc → 1.3.0-rc.1
|
|
280
|
+
|
|
281
|
+
# 7. 最终测试通过,发布正式版本
|
|
282
|
+
gw r
|
|
283
|
+
# 选择: release → 1.3.0
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 紧急修复发布流程
|
|
287
|
+
|
|
288
|
+
```bash
|
|
289
|
+
# 1. 基于生产版本创建 hotfix 分支
|
|
290
|
+
git checkout v1.2.3
|
|
291
|
+
gw h
|
|
292
|
+
# BUG-456, fix-critical-security-issue
|
|
293
|
+
|
|
294
|
+
# 2. 修复问题
|
|
295
|
+
gw c
|
|
296
|
+
# 🐛 fix(security): 修复关键安全漏洞
|
|
297
|
+
|
|
298
|
+
# 3. 发布补丁版本
|
|
299
|
+
gw r
|
|
300
|
+
# 选择: patch → 1.2.4
|
|
301
|
+
|
|
302
|
+
gw c # 提交版本更新
|
|
303
|
+
gw t # 创建标签
|
|
304
|
+
|
|
305
|
+
# 4. 合并到主分支
|
|
306
|
+
git checkout main
|
|
307
|
+
git merge hotfix/20260111-BUG-456-fix-critical-security-issue
|
|
308
|
+
|
|
309
|
+
# 5. 立即发布
|
|
310
|
+
npm publish
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## ⚙️ 版本发布配置
|
|
314
|
+
|
|
315
|
+
### 基础配置
|
|
316
|
+
|
|
317
|
+
```json
|
|
318
|
+
{
|
|
319
|
+
"release": {
|
|
320
|
+
"autoCommit": true,
|
|
321
|
+
"autoTag": true,
|
|
322
|
+
"commitMessage": "chore: release v{version}",
|
|
323
|
+
"tagMessage": "Release v{version}"
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### 配置项说明
|
|
329
|
+
|
|
330
|
+
| 配置项 | 类型 | 默认值 | 说明 |
|
|
331
|
+
| --------------- | --------- | ------------------------- | ------------------------ |
|
|
332
|
+
| `autoCommit` | `boolean` | `false` | 版本更新后自动提交 |
|
|
333
|
+
| `autoTag` | `boolean` | `false` | 版本更新后自动创建标签 |
|
|
334
|
+
| `commitMessage` | `string` | `"chore: release v{version}"` | 版本提交的消息模板 |
|
|
335
|
+
| `tagMessage` | `string` | `"Release v{version}"` | 标签消息模板 |
|
|
336
|
+
|
|
337
|
+
### 高级配置
|
|
338
|
+
|
|
339
|
+
```json
|
|
340
|
+
{
|
|
341
|
+
"release": {
|
|
342
|
+
"files": [
|
|
343
|
+
"package.json",
|
|
344
|
+
"package-lock.json",
|
|
345
|
+
"src/version.ts"
|
|
346
|
+
],
|
|
347
|
+
"prerelease": {
|
|
348
|
+
"alpha": "alpha",
|
|
349
|
+
"beta": "beta",
|
|
350
|
+
"rc": "rc"
|
|
351
|
+
},
|
|
352
|
+
"hooks": {
|
|
353
|
+
"prerelease": "npm run test",
|
|
354
|
+
"postrelease": "npm run build"
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
## 🎯 发布场景管理
|
|
361
|
+
|
|
362
|
+
### 场景一:功能版本发布
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
# 开发周期完成,准备发布新功能
|
|
366
|
+
# 当前版本: 1.2.3
|
|
367
|
+
|
|
368
|
+
# 1. 确保所有功能分支已合并
|
|
369
|
+
git checkout main
|
|
370
|
+
git pull origin main
|
|
371
|
+
|
|
372
|
+
# 2. 运行完整测试
|
|
373
|
+
npm test
|
|
374
|
+
|
|
375
|
+
# 3. 更新版本号
|
|
376
|
+
gw r
|
|
377
|
+
# 选择: minor → 1.3.0
|
|
378
|
+
|
|
379
|
+
# 4. 生成变更日志
|
|
380
|
+
npm run changelog
|
|
381
|
+
|
|
382
|
+
# 5. 提交版本更新
|
|
383
|
+
gw c
|
|
384
|
+
# 🔖 chore: 发布版本 v1.3.0
|
|
385
|
+
|
|
386
|
+
# 6. 创建发布标签
|
|
387
|
+
gw t
|
|
388
|
+
# v1.3.0
|
|
389
|
+
|
|
390
|
+
# 7. 推送并发布
|
|
391
|
+
git push origin main --tags
|
|
392
|
+
npm publish
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### 场景二:补丁版本发布
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
# 修复了重要 Bug,需要快速发布
|
|
399
|
+
# 当前版本: 1.3.0
|
|
400
|
+
|
|
401
|
+
# 1. 确认修复已完成
|
|
402
|
+
gw c
|
|
403
|
+
# 🐛 fix(api): 修复数据获取失败问题
|
|
404
|
+
|
|
405
|
+
# 2. 更新补丁版本
|
|
406
|
+
gw r
|
|
407
|
+
# 选择: patch → 1.3.1
|
|
408
|
+
|
|
409
|
+
# 3. 快速发布
|
|
410
|
+
gw c # 提交版本更新
|
|
411
|
+
gw t # 创建标签
|
|
412
|
+
git push origin main --tags
|
|
413
|
+
npm publish
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### 场景三:预发布版本管理
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
# 大版本开发中,需要预发布版本
|
|
420
|
+
# 当前版本: 1.3.1
|
|
421
|
+
|
|
422
|
+
# 1. 创建 alpha 版本
|
|
423
|
+
gw r
|
|
424
|
+
# 选择: alpha → 1.4.0-alpha.1
|
|
425
|
+
|
|
426
|
+
# 2. 发布到测试环境
|
|
427
|
+
npm publish --tag alpha
|
|
428
|
+
|
|
429
|
+
# 3. 收集反馈,修复问题
|
|
430
|
+
gw c # 修复提交
|
|
431
|
+
|
|
432
|
+
# 4. 递增 alpha 版本
|
|
433
|
+
gw r
|
|
434
|
+
# 选择: alpha → 1.4.0-alpha.2
|
|
435
|
+
|
|
436
|
+
# 5. 升级到 beta
|
|
437
|
+
gw r
|
|
438
|
+
# 选择: beta → 1.4.0-beta.1
|
|
439
|
+
|
|
440
|
+
# 6. 发布到预发布环境
|
|
441
|
+
npm publish --tag beta
|
|
442
|
+
|
|
443
|
+
# 7. 最终发布正式版本
|
|
444
|
+
gw r
|
|
445
|
+
# 选择: release → 1.4.0
|
|
446
|
+
|
|
447
|
+
npm publish --tag latest
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### 场景四:多版本维护
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
# 同时维护多个版本分支
|
|
454
|
+
# v1.x 维护分支
|
|
455
|
+
git checkout release/1.x
|
|
456
|
+
gw r
|
|
457
|
+
# patch → 1.3.2
|
|
458
|
+
|
|
459
|
+
# v2.x 维护分支
|
|
460
|
+
git checkout release/2.x
|
|
461
|
+
gw r
|
|
462
|
+
# patch → 2.1.1
|
|
463
|
+
|
|
464
|
+
# 主开发分支
|
|
465
|
+
git checkout main
|
|
466
|
+
gw r
|
|
467
|
+
# minor → 2.2.0
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## 🔧 高级发布技巧
|
|
471
|
+
|
|
472
|
+
### 技巧一:版本号同步
|
|
473
|
+
|
|
474
|
+
确保多个文件中的版本号保持同步:
|
|
475
|
+
|
|
476
|
+
```bash
|
|
477
|
+
# 自动更新多个文件中的版本号
|
|
478
|
+
# package.json
|
|
479
|
+
{
|
|
480
|
+
"version": "1.3.0"
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
# src/version.ts
|
|
484
|
+
export const VERSION = '1.3.0';
|
|
485
|
+
|
|
486
|
+
# README.md
|
|
487
|
+
# MyProject v1.3.0
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### 技巧二:变更日志生成
|
|
491
|
+
|
|
492
|
+
```bash
|
|
493
|
+
# 使用 conventional-changelog 生成变更日志
|
|
494
|
+
npm install -g conventional-changelog-cli
|
|
495
|
+
|
|
496
|
+
# 生成变更日志
|
|
497
|
+
conventional-changelog -p angular -i CHANGELOG.md -s
|
|
498
|
+
|
|
499
|
+
# 或集成到发布流程
|
|
500
|
+
{
|
|
501
|
+
"scripts": {
|
|
502
|
+
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
|
|
503
|
+
"release": "npm run changelog && gw r"
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
### 技巧三:发布钩子
|
|
509
|
+
|
|
510
|
+
```bash
|
|
511
|
+
# package.json 中的发布钩子
|
|
512
|
+
{
|
|
513
|
+
"scripts": {
|
|
514
|
+
"preversion": "npm test",
|
|
515
|
+
"version": "npm run build && git add -A",
|
|
516
|
+
"postversion": "git push && git push --tags"
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
### 技巧四:条件发布
|
|
522
|
+
|
|
523
|
+
```bash
|
|
524
|
+
# 只在特定分支发布
|
|
525
|
+
if [ "$(git branch --show-current)" = "main" ]; then
|
|
526
|
+
gw r
|
|
527
|
+
npm publish
|
|
528
|
+
else
|
|
529
|
+
echo "只能在 main 分支发布"
|
|
530
|
+
fi
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
## 📊 发布管理度量
|
|
534
|
+
|
|
535
|
+
### 发布频率统计
|
|
536
|
+
|
|
537
|
+
```bash
|
|
538
|
+
#!/bin/bash
|
|
539
|
+
# release-metrics.sh
|
|
540
|
+
|
|
541
|
+
echo "=== 版本发布度量报告 ==="
|
|
542
|
+
echo "时间: $(date)"
|
|
543
|
+
echo
|
|
544
|
+
|
|
545
|
+
# 发布频率统计
|
|
546
|
+
echo "📊 发布频率统计:"
|
|
547
|
+
git tag --sort=-creatordate | head -20 | while read tag; do
|
|
548
|
+
date=$(git log -1 --format=%ai $tag 2>/dev/null)
|
|
549
|
+
echo "$tag - $date"
|
|
550
|
+
done | head -10
|
|
551
|
+
echo
|
|
552
|
+
|
|
553
|
+
# 版本类型分布
|
|
554
|
+
echo "📊 版本类型分布:"
|
|
555
|
+
total_tags=$(git tag | wc -l)
|
|
556
|
+
major_tags=$(git tag | grep -E '\.[0-9]+\.0$' | wc -l)
|
|
557
|
+
minor_tags=$(git tag | grep -E '\.[1-9][0-9]*\.0$' | wc -l)
|
|
558
|
+
patch_tags=$(git tag | grep -E '\.[0-9]+\.[1-9][0-9]*$' | wc -l)
|
|
559
|
+
prerelease_tags=$(git tag | grep -E '(alpha|beta|rc)' | wc -l)
|
|
560
|
+
|
|
561
|
+
echo "总版本数: $total_tags"
|
|
562
|
+
echo "主版本: $major_tags"
|
|
563
|
+
echo "次版本: $minor_tags"
|
|
564
|
+
echo "补丁版本: $patch_tags"
|
|
565
|
+
echo "预发布版本: $prerelease_tags"
|
|
566
|
+
echo
|
|
567
|
+
|
|
568
|
+
# 发布间隔分析
|
|
569
|
+
echo "📊 发布间隔分析:"
|
|
570
|
+
git tag --sort=-creatordate | head -5 | while read current; do
|
|
571
|
+
previous=$(git tag --sort=-creatordate | grep -A1 "^$current$" | tail -1)
|
|
572
|
+
if [ "$previous" != "$current" ] && [ -n "$previous" ]; then
|
|
573
|
+
days=$(git log --format=%ct $previous..$current | head -1 | xargs -I {} date -d @{} +%s)
|
|
574
|
+
prev_days=$(git log --format=%ct $previous | head -1)
|
|
575
|
+
interval=$(( (days - prev_days) / 86400 ))
|
|
576
|
+
echo "$current: $interval 天"
|
|
577
|
+
fi
|
|
578
|
+
done
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
### 版本质量度量
|
|
582
|
+
|
|
583
|
+
```bash
|
|
584
|
+
# 统计每个版本的提交数量和类型
|
|
585
|
+
git tag --sort=-creatordate | head -10 | while read current; do
|
|
586
|
+
previous=$(git tag --sort=-creatordate | grep -A1 "^$current$" | tail -1)
|
|
587
|
+
if [ "$previous" != "$current" ] && [ -n "$previous" ]; then
|
|
588
|
+
echo "=== $current ==="
|
|
589
|
+
git log --oneline $previous..$current | wc -l | xargs echo "提交数:"
|
|
590
|
+
git log --oneline $previous..$current | grep -E '^[a-f0-9]+ (feat|fix|docs)' | \
|
|
591
|
+
cut -d' ' -f2 | sort | uniq -c
|
|
592
|
+
echo
|
|
593
|
+
fi
|
|
594
|
+
done
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
## 🚨 常见问题解决
|
|
598
|
+
|
|
599
|
+
### 问题一:版本号格式错误
|
|
600
|
+
|
|
601
|
+
```bash
|
|
602
|
+
❌ 版本号格式不正确: 1.2.3.4
|
|
603
|
+
```
|
|
604
|
+
|
|
605
|
+
**解决方案:**
|
|
606
|
+
- 遵循 semver 格式:`major.minor.patch[-prerelease]`
|
|
607
|
+
- 检查 package.json 中的版本号格式
|
|
608
|
+
- 使用工具提供的版本选择
|
|
609
|
+
|
|
610
|
+
### 问题二:package.json 不存在
|
|
611
|
+
|
|
612
|
+
```bash
|
|
613
|
+
❌ 找不到 package.json 文件
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
**解决方案:**
|
|
617
|
+
- 确认在正确的项目根目录
|
|
618
|
+
- 创建 package.json 文件:`npm init`
|
|
619
|
+
- 或手动创建基本的 package.json
|
|
620
|
+
|
|
621
|
+
### 问题三:版本更新失败
|
|
622
|
+
|
|
623
|
+
```bash
|
|
624
|
+
❌ 版本更新失败: 权限不足
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
**解决方案:**
|
|
628
|
+
- 检查文件写入权限
|
|
629
|
+
- 确认 package.json 不是只读
|
|
630
|
+
- 使用管理员权限运行
|
|
631
|
+
|
|
632
|
+
### 问题四:版本冲突
|
|
633
|
+
|
|
634
|
+
```bash
|
|
635
|
+
❌ 版本 1.3.0 已存在
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
**解决方案:**
|
|
639
|
+
- 选择不同的版本号
|
|
640
|
+
- 删除现有标签:`git tag -d v1.3.0`
|
|
641
|
+
- 或递增到下一个版本
|
|
642
|
+
|
|
643
|
+
## 🔗 与 CI/CD 集成
|
|
644
|
+
|
|
645
|
+
### GitHub Actions 集成
|
|
646
|
+
|
|
647
|
+
```yaml
|
|
648
|
+
# .github/workflows/release.yml
|
|
649
|
+
name: Release
|
|
650
|
+
on:
|
|
651
|
+
push:
|
|
652
|
+
tags:
|
|
653
|
+
- 'v*'
|
|
654
|
+
|
|
655
|
+
jobs:
|
|
656
|
+
release:
|
|
657
|
+
runs-on: ubuntu-latest
|
|
658
|
+
steps:
|
|
659
|
+
- uses: actions/checkout@v3
|
|
660
|
+
|
|
661
|
+
- name: Setup Node.js
|
|
662
|
+
uses: actions/setup-node@v3
|
|
663
|
+
with:
|
|
664
|
+
node-version: '18'
|
|
665
|
+
registry-url: 'https://registry.npmjs.org'
|
|
666
|
+
|
|
667
|
+
- name: Install dependencies
|
|
668
|
+
run: npm ci
|
|
669
|
+
|
|
670
|
+
- name: Run tests
|
|
671
|
+
run: npm test
|
|
672
|
+
|
|
673
|
+
- name: Build
|
|
674
|
+
run: npm run build
|
|
675
|
+
|
|
676
|
+
- name: Publish to npm
|
|
677
|
+
run: npm publish
|
|
678
|
+
env:
|
|
679
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
680
|
+
|
|
681
|
+
- name: Create GitHub Release
|
|
682
|
+
uses: actions/create-release@v1
|
|
683
|
+
env:
|
|
684
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
685
|
+
with:
|
|
686
|
+
tag_name: ${{ github.ref }}
|
|
687
|
+
release_name: Release ${{ github.ref }}
|
|
688
|
+
draft: false
|
|
689
|
+
prerelease: ${{ contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc') }}
|
|
690
|
+
```
|
|
691
|
+
|
|
692
|
+
### 自动化发布脚本
|
|
693
|
+
|
|
694
|
+
```bash
|
|
695
|
+
#!/bin/bash
|
|
696
|
+
# auto-release.sh
|
|
697
|
+
|
|
698
|
+
set -e
|
|
699
|
+
|
|
700
|
+
echo "🚀 开始自动发布流程..."
|
|
701
|
+
|
|
702
|
+
# 1. 检查工作区状态
|
|
703
|
+
if [ -n "$(git status --porcelain)" ]; then
|
|
704
|
+
echo "❌ 工作区不干净,请先提交或暂存更改"
|
|
705
|
+
exit 1
|
|
706
|
+
fi
|
|
707
|
+
|
|
708
|
+
# 2. 拉取最新代码
|
|
709
|
+
git pull origin main
|
|
710
|
+
|
|
711
|
+
# 3. 运行测试
|
|
712
|
+
echo "🧪 运行测试..."
|
|
713
|
+
npm test
|
|
714
|
+
|
|
715
|
+
# 4. 更新版本号
|
|
716
|
+
echo "📦 更新版本号..."
|
|
717
|
+
gw r
|
|
718
|
+
|
|
719
|
+
# 5. 构建项目
|
|
720
|
+
echo "🔨 构建项目..."
|
|
721
|
+
npm run build
|
|
722
|
+
|
|
723
|
+
# 6. 提交版本更新
|
|
724
|
+
echo "📝 提交版本更新..."
|
|
725
|
+
gw c
|
|
726
|
+
|
|
727
|
+
# 7. 创建标签
|
|
728
|
+
echo "🏷️ 创建版本标签..."
|
|
729
|
+
gw t
|
|
730
|
+
|
|
731
|
+
# 8. 推送到远程
|
|
732
|
+
echo "📤 推送到远程..."
|
|
733
|
+
git push origin main --tags
|
|
734
|
+
|
|
735
|
+
# 9. 发布到 npm
|
|
736
|
+
echo "📦 发布到 npm..."
|
|
737
|
+
npm publish
|
|
738
|
+
|
|
739
|
+
echo "✅ 发布完成!"
|
|
740
|
+
```
|
|
741
|
+
|
|
742
|
+
---
|
|
743
|
+
|
|
744
|
+
通过系统化的版本发布管理,你可以建立规范、可靠的软件发布流程。Git Workflow 的版本管理功能让复杂的发布过程变得简单,确保版本号的一致性和可追溯性。
|