@zjex/git-workflow 0.2.24 → 0.3.0

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.
Files changed (92) hide show
  1. package/.github/workflows/deploy-docs.yml +68 -0
  2. package/.github/workflows/test.yml +24 -4
  3. package/.husky/pre-commit +14 -0
  4. package/README.md +72 -1066
  5. package/dist/index.js +103 -13
  6. package/docs/.vitepress/cache/deps/_metadata.json +52 -0
  7. package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js +9719 -0
  8. package/docs/.vitepress/cache/deps/chunk-2CLQ7TTZ.js.map +7 -0
  9. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js +12824 -0
  10. package/docs/.vitepress/cache/deps/chunk-LE5NDSFD.js.map +7 -0
  11. package/docs/.vitepress/cache/deps/package.json +3 -0
  12. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js +4505 -0
  13. package/docs/.vitepress/cache/deps/vitepress___@vue_devtools-api.js.map +7 -0
  14. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js +583 -0
  15. package/docs/.vitepress/cache/deps/vitepress___@vueuse_core.js.map +7 -0
  16. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js +1352 -0
  17. package/docs/.vitepress/cache/deps/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
  18. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js +1665 -0
  19. package/docs/.vitepress/cache/deps/vitepress___mark__js_src_vanilla__js.js.map +7 -0
  20. package/docs/.vitepress/cache/deps/vitepress___minisearch.js +1813 -0
  21. package/docs/.vitepress/cache/deps/vitepress___minisearch.js.map +7 -0
  22. package/docs/.vitepress/cache/deps/vue.js +347 -0
  23. package/docs/.vitepress/cache/deps/vue.js.map +7 -0
  24. package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-2CLQ7TTZ.js +9719 -0
  25. package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-2CLQ7TTZ.js.map +7 -0
  26. package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-LE5NDSFD.js +12824 -0
  27. package/docs/.vitepress/cache/deps_temp_44e2fb0f/chunk-LE5NDSFD.js.map +7 -0
  28. package/docs/.vitepress/cache/deps_temp_44e2fb0f/package.json +3 -0
  29. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vue_devtools-api.js +4505 -0
  30. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vue_devtools-api.js.map +7 -0
  31. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_core.js +583 -0
  32. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_core.js.map +7 -0
  33. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_integrations_useFocusTrap.js +1352 -0
  34. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___@vueuse_integrations_useFocusTrap.js.map +7 -0
  35. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___mark__js_src_vanilla__js.js +1665 -0
  36. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___mark__js_src_vanilla__js.js.map +7 -0
  37. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___minisearch.js +1813 -0
  38. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vitepress___minisearch.js.map +7 -0
  39. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vue.js +347 -0
  40. package/docs/.vitepress/cache/deps_temp_44e2fb0f/vue.js.map +7 -0
  41. package/docs/.vitepress/config.ts +167 -0
  42. package/docs/.vitepress/theme/custom.css +39 -0
  43. package/docs/.vitepress/theme/index.ts +4 -0
  44. package/docs/README.md +82 -0
  45. package/docs/commands/branch.md +468 -0
  46. package/docs/commands/commit.md +554 -0
  47. package/docs/commands/config.md +346 -0
  48. package/docs/commands/index.md +312 -0
  49. package/docs/commands/interactive.md +384 -0
  50. package/docs/commands/release.md +300 -0
  51. package/docs/commands/stash.md +309 -0
  52. package/docs/commands/tag.md +278 -0
  53. package/docs/commands/update.md +347 -0
  54. package/docs/config/ai-config.md +160 -0
  55. package/docs/config/branch-config.md +133 -0
  56. package/docs/config/commit-config.md +185 -0
  57. package/docs/config/config-file.md +776 -0
  58. package/docs/config/examples.md +279 -0
  59. package/docs/config/index.md +478 -0
  60. package/docs/guide/ai-commit.md +576 -0
  61. package/docs/guide/basic-usage.md +522 -0
  62. package/docs/guide/best-practices.md +426 -0
  63. package/docs/guide/branch-management.md +712 -0
  64. package/docs/guide/getting-started.md +294 -0
  65. package/docs/guide/index.md +168 -0
  66. package/docs/guide/installation.md +449 -0
  67. package/docs/guide/release-management.md +744 -0
  68. package/docs/guide/stash-management.md +608 -0
  69. package/docs/guide/tag-management.md +614 -0
  70. package/docs/index.md +205 -0
  71. package/docs/public/favicon.svg +21 -0
  72. package/docs/public/hero-logo.svg +43 -0
  73. package/docs/public/logo.svg +20 -0
  74. package/package.json +11 -2
  75. package/scripts/publish.js +55 -8
  76. package/scripts/publish.sh +20 -2
  77. package/scripts/release.sh +20 -2
  78. package/scripts/update-test-count.js +55 -0
  79. package/src/ai-service.ts +101 -15
  80. package/src/commands/init.ts +18 -0
  81. package/src/config.ts +1 -0
  82. package/tests/ai-service.test.ts +237 -2
  83. package/tests/help.test.ts +134 -0
  84. package/tests/init.test.ts +582 -0
  85. package/tests/release.test.ts +333 -0
  86. package/tests/setup.ts +21 -0
  87. package/tests/stash.test.ts +376 -0
  88. package/tests/update.test.ts +402 -0
  89. package/vitest.config.ts +3 -0
  90. package/zjex-logo.svg +22 -0
  91. package/zjex-optimized.svg +34 -0
  92. package/zjex.svg +1 -0
@@ -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 的版本管理功能让复杂的发布过程变得简单,确保版本号的一致性和可追溯性。