164 lines
3.7 KiB
Markdown
164 lines
3.7 KiB
Markdown
# Git Commit Workflow
|
||
|
||
提交暂存文件,自动生成提交信息并创建版本标签的完整工作流。
|
||
|
||
## 概述
|
||
|
||
此工作流用于:
|
||
- 自动分析暂存区变更
|
||
- 根据 Conventional Commits 规范生成提交信息
|
||
- 检测项目类型并更新版本号
|
||
- 创建语义化版本标签
|
||
|
||
## 执行步骤
|
||
|
||
### 步骤 1: 检查暂存区
|
||
|
||
```bash
|
||
git diff --cached --name-only
|
||
```
|
||
|
||
- 如果暂存区为空,通知用户并停止
|
||
- 如果有文件,继续下一步
|
||
|
||
### 步骤 2: 收集信息(并行执行)
|
||
|
||
```bash
|
||
# 并行执行以下命令
|
||
git status
|
||
git diff --cached
|
||
git log --oneline -10
|
||
git tag --list | sort -V | tail -5
|
||
```
|
||
|
||
同时检查 `AGENTS.md` 文件获取:
|
||
- 仓库类型(polyrepo/monorepo)
|
||
- 版本规则
|
||
- 项目结构信息
|
||
|
||
### 步骤 3: 检测仓库类型
|
||
|
||
**Polyrepo(单仓库)**
|
||
- Tag 格式:`<version>`(如 `1.2.0`)
|
||
|
||
**Monorepo(多项目)**
|
||
- Tag 格式:`<subproject>-<version>`(如 `ios-1.2.0`)
|
||
- 检测特征:`packages/`、`apps/`、`services/` 目录
|
||
|
||
### 步骤 4: 检测项目类型和版本
|
||
|
||
| 项目类型 | 版本文件 | 版本字段 |
|
||
|---------|---------|---------|
|
||
| iOS | `*.xcodeproj/project.pbxproj` | `MARKETING_VERSION` |
|
||
| Node.js | `package.json` | `version` |
|
||
| Android (Groovy) | `app/build.gradle` | `versionName` |
|
||
| Android (Kotlin) | `app/build.gradle.kts` | `versionName` |
|
||
| Go | Git tag only | - |
|
||
| Python | `pyproject.toml` / `setup.py` | `version` |
|
||
| Rust | `Cargo.toml` | `version` |
|
||
|
||
### 步骤 5: 生成提交信息
|
||
|
||
遵循 Conventional Commits 格式:
|
||
|
||
```
|
||
<type>(<scope>): <subject>
|
||
```
|
||
|
||
**提交类型**:
|
||
|
||
| Type | 描述 | 版本影响 |
|
||
|------|------|---------|
|
||
| `feat` | 新功能 | minor +1 |
|
||
| `fix` | Bug 修复 | patch +1 |
|
||
| `perf` | 性能优化 | patch +1 |
|
||
| `BREAKING CHANGE` | 破坏性变更 | major +1 |
|
||
| `docs` | 文档更新 | 无 |
|
||
| `style` | 代码格式 | 无 |
|
||
| `refactor` | 重构 | 无 |
|
||
| `test` | 测试 | 无 |
|
||
| `chore` | 维护任务 | 无 |
|
||
| `ci` | CI/CD 变更 | 无 |
|
||
| `build` | 构建配置 | 无 |
|
||
|
||
**提交语言**:
|
||
- macOS/Linux:使用中文
|
||
- Windows:使用英文(避免编码问题)
|
||
|
||
**Monorepo Scope**:
|
||
- 单项目变更:`feat(ios): 添加上传功能`
|
||
- 多项目变更:`chore: 更新共享依赖`
|
||
|
||
### 步骤 6: 确定新版本号
|
||
|
||
根据提交类型计算新版本:
|
||
|
||
**版本递增规则**:
|
||
- `feat`:minor +1(如 `1.2.0` → `1.3.0`)
|
||
- `fix`/`perf`:patch +1(如 `1.2.3` → `1.2.4`)
|
||
- Breaking change:major +1(如 `1.2.3` → `2.0.0`)
|
||
|
||
**不更新版本**:
|
||
- `docs`、`test`、`refactor`、`style`、`build`、`ci`、`chore`
|
||
|
||
### 步骤 7: 更新版本文件并暂存
|
||
|
||
如果需要更新版本(步骤 6 确定了新版本号):
|
||
|
||
1. **更新版本文件**:将版本号写入对应的版本文件
|
||
2. **添加到暂存区**:
|
||
```bash
|
||
git add <version-file>
|
||
```
|
||
3. **验证暂存**:
|
||
```bash
|
||
git diff --cached --name-only
|
||
```
|
||
确认版本文件已在暂存区
|
||
|
||
### 步骤 8: 执行提交
|
||
|
||
```bash
|
||
git commit -m "<commit-message>"
|
||
```
|
||
|
||
### 步骤 9: 创建版本标签
|
||
|
||
仅在版本更新时创建(除非用户指定 "skip tag"):
|
||
|
||
**Polyrepo**:
|
||
```bash
|
||
git tag -a "1.2.0" -m "<commit-message>"
|
||
```
|
||
|
||
**Monorepo**:
|
||
```bash
|
||
git tag -a "ios-1.2.0" -m "<commit-message>"
|
||
```
|
||
|
||
## 选项
|
||
|
||
- `skip tag` / `skip`:跳过标签创建
|
||
|
||
## 输出格式
|
||
|
||
```
|
||
✓ 提交成功
|
||
|
||
提交信息:[commit message]
|
||
版本标签:[tag](如果创建了)
|
||
|
||
要推送到远程仓库,请运行:/git-push
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
- 此命令**不会推送**到远程,使用 `/git-push` 推送
|
||
- 暂存区为空时会提示用户先 `git add`
|
||
- 标签注释使用与提交相同的消息内容
|
||
|
||
## 相关文档
|
||
|
||
- [Git Workflow Best Practices](./SKILL.md)
|
||
- [Push Workflow](./push-workflow.md)
|