@zjex/git-workflow 0.3.10 → 0.4.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.
@@ -6,27 +6,29 @@ Git Workflow 提供了一套简洁而强大的命令,涵盖了 Git 工作流
6
6
 
7
7
  ### 核心命令
8
8
 
9
- | 命令 | 别名 | 功能 | 示例 |
10
- | ------- | ----------------- | -------------------- | ----------------------- |
11
- | `gw` | - | 显示交互式菜单 | `gw` |
12
- | `gw f` | `feat`, `feature` | 创建 feature 分支 | `gw f --base develop` |
13
- | `gw h` | `fix`, `hotfix` | 创建 hotfix 分支 | `gw h` |
14
- | `gw c` | `cm`, `commit` | 提交代码(AI 模式) | `gw c` |
15
- | `gw log`| `ls`, `l` | 查看提交历史 | `gw log` |
16
- | `gw t` | `tag` | 创建 tag | `gw t v` |
17
- | `gw d` | `del`, `delete` | 删除分支 | `gw d feature/old` |
18
- | `gw s` | `st`, `stash` | 管理 stash | `gw s` |
9
+ | 命令 | 别名 | 功能 | 示例 |
10
+ | -------- | ----------------- | ------------------- | --------------------- |
11
+ | `gw` | - | 显示交互式菜单 | `gw` |
12
+ | `gw f` | `feat`, `feature` | 创建 feature 分支 | `gw f --base develop` |
13
+ | `gw h` | `fix`, `hotfix` | 创建 hotfix 分支 | `gw h` |
14
+ | `gw c` | `cm`, `commit` | 提交代码(AI 模式) | `gw c` |
15
+ | `gw log` | `ls`, `l` | 查看提交历史 | `gw log` |
16
+ | `gw t` | `tag` | 创建 tag | `gw t v` |
17
+ | `gw brd` | `br:del` | 删除分支 | `gw brd feature/old` |
18
+ | `gw s` | `st`, `stash` | 管理 stash | `gw s` |
19
19
 
20
20
  ### 辅助命令
21
21
 
22
- | 命令 | 别名 | 功能 | 示例 |
23
- | -------- | ------ | ------------------------ | --------- |
24
- | `gw r` | `release` | 发布版本 | `gw r` |
25
- | `gw ts` | `tags` | 列出 tags | `gw ts v` |
26
- | `gw td` | `tag:delete` | 删除 tag | `gw td` |
27
- | `gw tu` | `tag:update` | 修改 tag | `gw tu` |
28
- | `gw init`| - | 初始化配置 | `gw init` |
29
- | `gw upt` | `update` | 更新工具 | `gw upt` |
22
+ | 命令 | 别名 | 功能 | 示例 |
23
+ | --------- | ------------ | ------------------ | --------- |
24
+ | `gw r` | `release` | 发布版本 | `gw r` |
25
+ | `gw ts` | `tags` | 列出 tags | `gw ts v` |
26
+ | `gw td` | `tag:del` | 删除 tag | `gw td` |
27
+ | `gw tu` | `tag:update` | 修改 tag | `gw tu` |
28
+ | `gw tc` | `tag:clean` | 清理无效 tag | `gw tc` |
29
+ | `gw init` | - | 初始化配置 | `gw init` |
30
+ | `gw upt` | `update` | 更新工具 | `gw upt` |
31
+ | `gw cc` | `clean` | 清理缓存和临时文件 | `gw cc` |
30
32
 
31
33
  ## 🎯 使用模式
32
34
 
@@ -68,6 +70,7 @@ gw
68
70
  ```
69
71
 
70
72
  **特点:**
73
+
71
74
  - 🎨 优雅的 ASCII Art Logo
72
75
  - 📋 清晰的操作菜单
73
76
  - 🎯 键盘快捷操作
@@ -92,6 +95,7 @@ gw d
92
95
  ```
93
96
 
94
97
  **特点:**
98
+
95
99
  - ⚡️ 快速执行
96
100
  - 🤖 支持脚本化
97
101
  - 📝 支持参数传递
@@ -126,15 +130,15 @@ Git Workflow 使用颜色来区分不同类型的信息:
126
130
 
127
131
  所有交互界面都支持键盘操作:
128
132
 
129
- | 按键 | 功能 |
130
- | ---------- | ------------------------ |
131
- | ↑/↓ | 上下选择选项 |
132
- | ←/→ | 左右切换(多选模式) |
133
- | 空格 | 选择/取消选择(多选模式) |
134
- | 回车 | 确认选择 |
135
- | Ctrl+C | 优雅退出 |
136
- | Tab | 自动补全(输入模式) |
137
- | Esc | 取消当前操作 |
133
+ | 按键 | 功能 |
134
+ | ------ | ------------------------- |
135
+ | ↑/↓ | 上下选择选项 |
136
+ | ←/→ | 左右切换(多选模式) |
137
+ | 空格 | 选择/取消选择(多选模式) |
138
+ | 回车 | 确认选择 |
139
+ | Ctrl+C | 优雅退出 |
140
+ | Tab | 自动补全(输入模式) |
141
+ | Esc | 取消当前操作 |
138
142
 
139
143
  ## 🔧 全局选项
140
144
 
@@ -173,8 +177,8 @@ DEBUG=gw:* gw c
173
177
  专注于分支的创建、删除和管理:
174
178
 
175
179
  - [**gw f**](/commands/branch#创建-feature-分支) - 创建 feature 分支
176
- - [**gw h**](/commands/branch#创建-hotfix-分支) - 创建 hotfix 分支
177
- - [**gw d**](/commands/branch#删除分支) - 删除本地/远程分支
180
+ - [**gw h**](/commands/branch#创建-hotfix-分支) - 创建 hotfix 分支
181
+ - [**gw brd**](/commands/branch#删除分支) - 删除本地/远程分支
178
182
 
179
183
  ### 提交管理
180
184
 
@@ -191,6 +195,7 @@ DEBUG=gw:* gw c
191
195
  - [**gw ts**](/commands/tag#列出-tags) - 列出所有标签
192
196
  - [**gw td**](/commands/tag#删除-tag) - 删除标签
193
197
  - [**gw tu**](/commands/tag#修改-tag) - 修改标签
198
+ - [**gw tc**](/commands/tag#清理无效-tag) - 清理无效标签
194
199
  - [**gw r**](/commands/release) - 发布新版本
195
200
 
196
201
  ### 代码暂存
@@ -205,7 +210,7 @@ DEBUG=gw:* gw c
205
210
 
206
211
  - [**gw init**](/commands/config) - 初始化配置
207
212
  - [**gw upt**](/commands/update) - 更新工具
208
- - [**gw clean**](/commands/update#清理缓存) - 清理缓存
213
+ - [**gw cc**](/commands/update#清理缓存) - 清理缓存和临时文件
209
214
 
210
215
  ## 🚀 快速参考
211
216
 
@@ -290,7 +295,7 @@ gw d
290
295
  - **我想提交代码** → `gw c` (commit)
291
296
  - **我想查看历史** → `gw log` (log)
292
297
  - **我想创建版本** → `gw t` (tag) 或 `gw r` (release)
293
- - **我想删除分支** → `gw d` (delete)
298
+ - **我想删除分支** → `gw brd` (branch delete)
294
299
  - **我想管理 stash** → `gw s` (stash)
295
300
  - **我想配置工具** → `gw init`
296
301
  - **我想更新工具** → `gw upt`
@@ -302,7 +307,7 @@ gw d
302
307
  - **提交当前更改** → `gw c`
303
308
  - **查看项目历史** → `gw log`
304
309
  - **发布新版本** → `gw r` + `gw t`
305
- - **清理旧分支** → `gw d`
310
+ - **清理旧分支** → `gw brd`
306
311
  - **暂存当前工作** → `gw s`
307
312
 
308
313
  ### 交互式查找
@@ -316,4 +321,4 @@ gw
316
321
 
317
322
  ---
318
323
 
319
- 掌握这些命令后,你就能高效地管理 Git 工作流了。每个命令都经过精心设计,旨在简化复杂的 Git 操作,让你专注于代码开发。
324
+ 掌握这些命令后,你就能高效地管理 Git 工作流了。每个命令都经过精心设计,旨在简化复杂的 Git 操作,让你专注于代码开发。
@@ -4,12 +4,13 @@ Tag 管理相关的命令详解。
4
4
 
5
5
  ## 📋 命令列表
6
6
 
7
- | 命令 | 别名 | 说明 |
8
- |------|------|------|
9
- | `gw tags [prefix]` | `gw ts` | 列出 tag |
10
- | `gw tag [prefix]` | `gw t` | 创建 tag |
11
- | `gw tag:delete` | `gw td` | 删除 tag |
12
- | `gw tag:update` | `gw tu` | 修改 tag |
7
+ | 命令 | 别名 | 说明 |
8
+ | ------------------ | ------- | ------------ |
9
+ | `gw tags [prefix]` | `gw ts` | 列出 tag |
10
+ | `gw tag [prefix]` | `gw t` | 创建 tag |
11
+ | `gw tag:del` | `gw td` | 删除 tag |
12
+ | `gw tag:update` | `gw tu` | 修改 tag |
13
+ | `gw tag:clean` | `gw tc` | 清理无效 tag |
13
14
 
14
15
  ## 📋 列出 Tag
15
16
 
@@ -32,7 +33,7 @@ $ gw ts
32
33
  📋 所有 tags (按时间倒序):
33
34
 
34
35
  v1.2.0 Release v1.2.0 2 days ago
35
- v1.1.0 Release v1.1.0 1 week ago
36
+ v1.1.0 Release v1.1.0 1 week ago
36
37
  v1.0.0 Initial release 2 weeks ago
37
38
 
38
39
  共 3 个 tags
@@ -139,23 +140,78 @@ $ gw tu
139
140
  ✔ 已推送到远程
140
141
  ```
141
142
 
143
+ ## 🧹 清理无效 Tag
144
+
145
+ ### 基本用法
146
+
147
+ ```bash
148
+ gw tag:clean
149
+ gw tc
150
+ ```
151
+
152
+ ### 什么是无效 Tag
153
+
154
+ 无效 tag 是指那些不包含有效版本号的标签,通常是由于脚本错误或配置问题产生的,例如:
155
+
156
+ - `vnull` - 版本号为 null
157
+ - `vundefined` - 版本号为 undefined
158
+ - `v` - 空版本号
159
+ - 其他不符合版本规范的标签
160
+
161
+ ### 清理流程
162
+
163
+ ```bash
164
+ $ gw tc
165
+ 🧹 清理无效 tag
166
+
167
+ 检测到以下无效 tag:
168
+
169
+ vnull
170
+ 提交: abc1234 (2 days ago)
171
+ 作者: John Doe
172
+ 消息: Release vnull
173
+
174
+ vundefined
175
+ 提交: def5678 (1 week ago)
176
+ 作者: Jane Smith
177
+ 消息: Release vundefined
178
+
179
+ ? 是否删除这些无效 tag?
180
+ ❯ 是,删除本地和远程
181
+ 取消
182
+
183
+ ✔ 本地 tag 已删除: vnull
184
+ ✔ 远程 tag 已删除: origin/vnull
185
+ ✔ 本地 tag 已删除: vundefined
186
+ ✔ 远程 tag 已删除: origin/vundefined
187
+
188
+ ✔ 已清理 2 个无效 tag
189
+ ```
190
+
191
+ ### 安全性
192
+
193
+ - 只会删除明确不包含数字的标签
194
+ - 删除前会显示详细信息供确认
195
+ - 支持仅删除本地或同时删除远程
196
+ - 不会影响正常的版本标签
197
+
142
198
  ## 🔧 版本类型详解
143
199
 
144
200
  ### 标准版本
145
201
 
146
- | 类型 | 说明 | 示例 |
147
- |------|------|------|
202
+ | 类型 | 说明 | 示例 |
203
+ | ------- | ------------------ | ------------- |
148
204
  | `patch` | 补丁版本,Bug 修复 | 1.0.0 → 1.0.1 |
149
- | `minor` | 次版本,新功能 | 1.0.0 → 1.1.0 |
205
+ | `minor` | 次版本,新功能 | 1.0.0 → 1.1.0 |
150
206
  | `major` | 主版本,破坏性变更 | 1.0.0 → 2.0.0 |
151
207
 
152
208
  ### 预发布版本
153
209
 
154
- | 类型 | 说明 | 示例 |
155
- |------|------|------|
210
+ | 类型 | 说明 | 示例 |
211
+ | ------- | ---------- | --------------------- |
156
212
  | `alpha` | 内部测试版 | 1.0.0 → 1.0.1-alpha.1 |
157
- | `beta` | 公开测试版 | 1.0.0 → 1.0.1-beta.1 |
158
- | `rc` | 发布候选版 | 1.0.0 → 1.0.1-rc.1 |
213
+ | `beta` | 公开测试版 | 1.0.0 → 1.0.1-beta.1 |
214
+ | `rc` | 发布候选版 | 1.0.0 → 1.0.1-rc.1 |
159
215
 
160
216
  ### 预发布版本升级
161
217
 
@@ -275,4 +331,4 @@ gw tag
275
331
  1.0.0-beta.2 → 修复反馈
276
332
  1.0.0-rc.1 → 发布候选
277
333
  1.0.0 → 正式发布
278
- ```
334
+ ```
@@ -4,9 +4,10 @@
4
4
 
5
5
  ## 📋 命令概览
6
6
 
7
- | 命令 | 别名 | 说明 |
8
- |------|------|------|
7
+ | 命令 | 别名 | 说明 |
8
+ | ----------- | -------- | -------------------- |
9
9
  | `gw update` | `gw upt` | 检查并更新到最新版本 |
10
+ | `gw clean` | `gw cc` | 清理缓存和临时文件 |
10
11
 
11
12
  ## 🔄 版本更新
12
13
 
@@ -344,4 +345,79 @@ diff ~/.gwrc.json.backup ~/.gwrc.json
344
345
  # 监控版本状态
345
346
  gw --version
346
347
  gw update --check-only # 仅检查,不更新
347
- ```
348
+ ```
349
+
350
+ ## 🧹 清理缓存
351
+
352
+ ### 基本用法
353
+
354
+ ```bash
355
+ gw clean
356
+ gw cc
357
+ ```
358
+
359
+ ### 清理内容
360
+
361
+ 工具会清理以下文件:
362
+
363
+ 1. **更新缓存** - `~/.gw-update-check`
364
+ 2. **全局配置** - `~/.gwrc.json` (可选)
365
+ 3. **临时文件** - `/tmp/.gw-commit-msg-*`
366
+
367
+ ### 清理流程
368
+
369
+ ```bash
370
+ $ gw clean
371
+ ? 检测到全局配置文件,是否删除?
372
+ ❯ 否,保留配置文件
373
+ 是,删除配置文件
374
+
375
+ ✔ 已清理 3 个文件
376
+ ```
377
+
378
+ ### 删除全局配置
379
+
380
+ 如果选择删除全局配置文件:
381
+
382
+ ```bash
383
+ $ gw clean
384
+ ? 检测到全局配置文件,是否删除?
385
+ ❯ 是,删除配置文件
386
+
387
+ ✔ 已清理 5 个文件
388
+
389
+ ⚠️ 全局配置文件已删除
390
+ 如需重新配置,请运行: gw init
391
+ ```
392
+
393
+ ### 使用场景
394
+
395
+ **定期清理:**
396
+
397
+ ```bash
398
+ # 清理缓存,释放空间
399
+ gw clean
400
+ ```
401
+
402
+ **重置配置:**
403
+
404
+ ```bash
405
+ # 删除配置后重新初始化
406
+ gw clean # 选择删除配置
407
+ gw init # 重新配置
408
+ ```
409
+
410
+ **故障排除:**
411
+
412
+ ```bash
413
+ # 清理缓存解决更新检查问题
414
+ gw clean
415
+ gw update
416
+ ```
417
+
418
+ ### 安全性
419
+
420
+ - 删除全局配置前会询问确认
421
+ - 不会删除项目级配置文件
422
+ - 不会影响 Git 仓库数据
423
+ - 可以随时通过 `gw init` 重新配置
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zjex/git-workflow",
3
- "version": "0.3.10",
3
+ "version": "0.4.0",
4
4
  "description": "🚀 极简的 Git 工作流 CLI 工具,让分支管理和版本发布变得轻松愉快",
5
5
  "type": "module",
6
6
  "bin": {
@@ -624,3 +624,123 @@ export async function updateTag(): Promise<void> {
624
624
  }
625
625
  }
626
626
  }
627
+
628
+ /**
629
+ * 清理无效标签(不包含数字的标签)
630
+ */
631
+ export async function cleanInvalidTags(): Promise<void> {
632
+ const fetchSpinner = ora("正在获取 tags...").start();
633
+ exec("git fetch --tags", true);
634
+ fetchSpinner.stop();
635
+
636
+ divider();
637
+
638
+ // 获取所有标签
639
+ const allTags = execOutput("git tag -l").split("\n").filter(Boolean);
640
+
641
+ // 过滤出无效标签(不包含数字)
642
+ const invalidTags = allTags.filter((tag) => !/\d/.test(tag));
643
+
644
+ if (invalidTags.length === 0) {
645
+ console.log(colors.green("✅ 没有找到无效标签"));
646
+ return;
647
+ }
648
+
649
+ console.log(colors.yellow(`❌ 找到 ${invalidTags.length} 个无效标签:`));
650
+ console.log("");
651
+
652
+ // 显示每个无效标签的详细信息
653
+ for (const tag of invalidTags) {
654
+ try {
655
+ const commitHash = execOutput(`git rev-list -n 1 "${tag}"`).trim();
656
+ const commitDate = execOutput(`git log -1 --format=%ai "${tag}"`).trim();
657
+ const commitMsg = execOutput(`git log -1 --format=%s "${tag}"`).trim();
658
+
659
+ console.log(colors.red(` 标签: ${tag}`));
660
+ console.log(colors.dim(` Commit: ${commitHash}`));
661
+ console.log(colors.dim(` 日期: ${commitDate}`));
662
+ console.log(colors.dim(` 消息: ${commitMsg}`));
663
+ console.log("");
664
+ } catch {
665
+ console.log(colors.red(` 标签: ${tag}`));
666
+ console.log(colors.dim(` (无法获取提交信息)`));
667
+ console.log("");
668
+ }
669
+ }
670
+
671
+ divider();
672
+
673
+ const shouldClean = await select({
674
+ message: "是否删除这些无效标签?",
675
+ choices: [
676
+ { name: "是,删除所有无效标签", value: true },
677
+ { name: "否,取消操作", value: false },
678
+ ],
679
+ theme,
680
+ });
681
+
682
+ if (!shouldClean) {
683
+ console.log(colors.yellow("已取消"));
684
+ return;
685
+ }
686
+
687
+ divider();
688
+
689
+ // 删除本地标签
690
+ const localSpinner = ora("正在删除本地无效标签...").start();
691
+ let localSuccess = 0;
692
+ let localFailed = 0;
693
+
694
+ for (const tag of invalidTags) {
695
+ try {
696
+ execSync(`git tag -d "${tag}"`, { stdio: "pipe" });
697
+ localSuccess++;
698
+ } catch {
699
+ localFailed++;
700
+ }
701
+ }
702
+
703
+ if (localFailed === 0) {
704
+ localSpinner.succeed(`本地标签已删除: ${localSuccess} 个`);
705
+ } else {
706
+ localSpinner.warn(
707
+ `本地标签删除: 成功 ${localSuccess} 个,失败 ${localFailed} 个`
708
+ );
709
+ }
710
+
711
+ // 询问是否删除远程标签
712
+ const deleteRemote = await select({
713
+ message: "是否同时删除远程的无效标签?",
714
+ choices: [
715
+ { name: "是", value: true },
716
+ { name: "否", value: false },
717
+ ],
718
+ theme,
719
+ });
720
+
721
+ if (deleteRemote) {
722
+ const remoteSpinner = ora("正在删除远程无效标签...").start();
723
+ let remoteSuccess = 0;
724
+ let remoteFailed = 0;
725
+
726
+ for (const tag of invalidTags) {
727
+ try {
728
+ execSync(`git push origin --delete "${tag}"`, { stdio: "pipe" });
729
+ remoteSuccess++;
730
+ } catch {
731
+ remoteFailed++;
732
+ }
733
+ }
734
+
735
+ if (remoteFailed === 0) {
736
+ remoteSpinner.succeed(`远程标签已删除: ${remoteSuccess} 个`);
737
+ } else {
738
+ remoteSpinner.warn(
739
+ `远程标签删除: 成功 ${remoteSuccess} 个,失败 ${remoteFailed} 个`
740
+ );
741
+ }
742
+ }
743
+
744
+ console.log("");
745
+ console.log(colors.green("✨ 清理完成!"));
746
+ }