原 GIT-05 要求 subject 用英文祈使句,与团队实际书写习惯不符(已有提交均为 中文),且缺少中英混排与术语约定,容易写出 Chinglish、自造术语或中英标点混乱。 本次改动: - GIT-05 改为「提交信息一律使用中文」,type / scope 保留英文小写,规定祈使句、 字数(≤50 汉字 / 整行 ≤72 字符)与不加句末标点; - 新增 GIT-21~GIT-23:中英文间加空格、使用全角标点与反引号、术语沿用 PRD 术语表、 禁止 Chinglish 与无信息缩写; - 新增 §2.2 commitlint 配置要点:中文必须关闭 subject-case、拦截中文句号, 否则钩子校验实际无效; - 同步 03(commit-msg 钩子说明)、07(PR-01 标题用中文)与 AGENTS §7 / §9 / 附录。 影响面:仅文档,无代码影响。新规则对后续提交生效,已推送的历史提交不改写 (GIT-15 禁止改写 main 历史)。 回滚方式:git revert 本提交。
147 lines
6.4 KiB
Markdown
147 lines
6.4 KiB
Markdown
# 01 · Git 规范
|
||
|
||
| 项 | 内容 |
|
||
| --- | --- |
|
||
| 文档版本 | V1.0(2026-11-02) |
|
||
| 依据 | 技术架构 §4.6(CI/CD)、§10.1(仓库结构) |
|
||
| 适用范围 | 全仓库(代码、文档、配置、迁移) |
|
||
| 强制级别 | 强制 |
|
||
|
||
---
|
||
|
||
## 1 分支模型
|
||
|
||
采用 **trunk-based(主干 + 短生命周期分支)**,不建 `develop`、不建长期 `release` 分支。
|
||
|
||
| 类型 | 命名 | 用途 | 生命周期 |
|
||
| --- | --- | --- | --- |
|
||
| 主干 | `main` | 始终可发布 | 永久 |
|
||
| 功能 | `feat/<scope>-<简述>` | 新功能 | ≤ 5 天,超过须拆分 |
|
||
| 修复 | `fix/<scope>-<简述>` | 缺陷修复 | ≤ 2 天 |
|
||
| 文档 | `docs/<简述>` | 仅文档 | ≤ 1 天 |
|
||
| 重构 | `refactor/<scope>-<简述>` | 行为不变的结构调整 | ≤ 3 天 |
|
||
| 其他 | `chore/` `test/` `perf/` `build/` `ci/` | 对应类型 | ≤ 2 天 |
|
||
|
||
规则:
|
||
|
||
- `GIT-01` 分支名全小写 kebab-case,≤ 50 字符,**不含中文**;`scope` 用模块或包名(`api` / `web` / `worker` / `media` / `db` / `ci` / `docs`)。
|
||
- `GIT-02` 分支必须从最新 `main` 拉出,合并前 rebase 到 `main` 最新。
|
||
- `GIT-03` 禁止直接 push `main`;分支保护开启:必须 PR + CI 绿 + ≥1 批准。
|
||
- `GIT-04` 合并后立即删除远端分支。
|
||
|
||
---
|
||
|
||
## 2 提交信息(Conventional Commits 1.0)
|
||
|
||
```
|
||
<type>(<scope>): <中文简述>
|
||
|
||
<body:中文,说明为什么改 + 影响面 / 回滚方式>
|
||
|
||
<footer:BREAKING CHANGE / Refs: R-xx / Closes #12>
|
||
```
|
||
|
||
| `type` | 用途 |
|
||
| --- | --- |
|
||
| `feat` | 新功能 |
|
||
| `fix` | 缺陷修复 |
|
||
| `docs` | 文档 |
|
||
| `style` | 仅格式(不影响逻辑) |
|
||
| `refactor` | 重构(不改行为) |
|
||
| `perf` | 性能 |
|
||
| `test` | 测试 |
|
||
| `build` | 构建 / 依赖 |
|
||
| `ci` | CI / 脚本 |
|
||
| `chore` | 杂项 |
|
||
| `revert` | 回滚 |
|
||
|
||
规则:
|
||
|
||
- `GIT-05` 提交信息(`subject` + 正文)**一律使用中文**;`type` / `scope` 保留英文小写。`subject` 用祈使句(「新增 …」而非「新增了 …」「新增的 …」),≤ 50 个汉字且整行 ≤ 72 字符,**不加句末标点**(英文 `.` 与中文 `。` 均禁止)。
|
||
- `GIT-06` `scope` 必填,取值见 `GIT-01`。
|
||
- `GIT-07` 正文说明「**为什么**」与「**影响面 / 回滚方式**」;纯重命名类可仅一行 subject。
|
||
- `GIT-08` 破坏性变更:`type` 后加 `!` 且 footer 写 `BREAKING CHANGE: <说明与迁移方式>`。
|
||
- `GIT-09` 关联业务规则写 `Refs: R-04`;关联 issue 写 `Closes #123`。
|
||
- `GIT-10` 一个提交只做一件事;**禁止**在功能提交里顺带格式化无关文件。
|
||
- `GIT-11` 禁止 `WIP`、`fix bug`、`update` 等无信息量信息;禁止 `--no-verify` 绕过钩子。
|
||
|
||
示例:
|
||
|
||
```
|
||
feat(media): 图片批次支持按规格矩阵展开任务项
|
||
|
||
批量生产原先按「模板 × 商品图」展开,导致同素材多规格重复建素材,
|
||
违反 PRD R-25「素材为主对象、规格为属性」。改为展开到 task_item,
|
||
规格作为属性写入 material_specs。
|
||
|
||
影响面:production_tasks 新增 spec_key 列(expand 迁移,兼容旧数据)。
|
||
回滚方式:关闭 FEATURE_MATRIX_SPEC 开关,旧路径仍可用。
|
||
Refs: R-25
|
||
```
|
||
|
||
### 2.1 中文书写与中英混排(GIT-21 ~ GIT-23)
|
||
|
||
- `GIT-21` 中文与英文 / 数字之间**加一个空格**(`新增 PRD V1.6`、`导出 50 张图`);标点用中文全角;代码、命令、文件名、版本号、错误码用反引号包裹并保留原文。
|
||
- `GIT-22` 术语沿用 PRD 附录 C 术语表,**禁止自造同义词**(「素材规格」不写「素材尺寸」,「要素卡」不写「简报卡」)。
|
||
- `GIT-23` 禁止 Chinglish 与无信息缩写:不写 `add 功能 for batch`、`opt`、`tmp`、`misc`、`update`;`type` / `scope` 之外的英文只能是专有名词、标识符或引用编号。
|
||
|
||
### 2.2 commitlint 配置要点
|
||
|
||
中文提交信息有三个坑,必须在 `commitlint.config.mjs` 中显式处理,否则校验形同无效:
|
||
|
||
```js
|
||
export default {
|
||
extends: ['@commitlint/config-conventional'],
|
||
rules: {
|
||
'subject-case': [0], // 中文无大小写概念,关闭该规则
|
||
'header-max-length': [2, 'always', 72], // 按字符计,中文每个字计 1
|
||
'subject-full-stop': [2, 'never', '。'], // 拦截中文句号
|
||
'subject-empty': [2, 'never'],
|
||
},
|
||
};
|
||
```
|
||
|
||
> 对应的 husky `commit-msg` 钩子见 [03-格式化与Lint](03-格式化与Lint.md) §4。
|
||
|
||
---
|
||
|
||
## 3 PR 与合并
|
||
|
||
- `GIT-12` PR 标题遵循提交规范(Squash 后即主干提交信息)。
|
||
- `GIT-13` 合并方式统一 **Squash Merge**,保持 `main` 线性;禁止 Merge commit。
|
||
- `GIT-14` 单个 PR 变更 ≤ 400 行(含测试,不含 lock 文件与生成代码);超出须拆分并在描述说明依赖关系。
|
||
- `GIT-15` 禁止 force push `main` / 已有人 Review 的公共分支;个人分支允许 `--force-with-lease`。
|
||
- `GIT-16` PR 描述模板与双人 Review 场景见 [07-CodeReview与PR规范](07-CodeReview与PR规范.md)。
|
||
|
||
---
|
||
|
||
## 4 Tag 与发布
|
||
|
||
| 项 | 规则 |
|
||
| --- | --- |
|
||
| 版本号 | 语义化 `v<主>.<次>.<补>` |
|
||
| 打 Tag 时机 | 生产发布前,由发布负责人在 `main` 打 annotated tag |
|
||
| 里程碑 Tag | `m0` / `m1` / `m2`…(对应 PRD 分期),仅标记不进版本链 |
|
||
| 发布记录 | 每个 Tag 必须写变更摘要(可复用 PR 标题集合) |
|
||
| 回滚 | 回滚用新 Tag(`v1.2.1` 回滚 `v1.2.0` 内容),**禁止删除已发布 Tag** |
|
||
|
||
---
|
||
|
||
## 5 大文件与二进制
|
||
|
||
- `GIT-17` 禁止入库 > 10 MB 的二进制(PSD 模板、成片、视频、字体包),一律走对象存储;确需入库(如开源字体)用 **Git LFS** 并在 PR 说明。
|
||
- `GIT-18` 禁止入库:`.env*`、密钥、证书私钥、构建产物、`node_modules/`、日志、`项目参考/`。
|
||
- `GIT-19` `pnpm-lock.yaml` 必须提交且与 `package.json` 同步;**禁止**手工编辑 lock 文件。
|
||
- `GIT-20` 误提交敏感信息:立即轮换密钥 → 用 `git filter-repo` 清理历史 → 全员重新 clone → 记录复盘。
|
||
|
||
---
|
||
|
||
## 6 检查清单(提交前 / 合并前)
|
||
|
||
- [ ] 分支名符合 `GIT-01`,从最新 `main` 拉出
|
||
- [ ] 提交信息为**中文**且符合 Conventional Commits(含 `scope`),subject 无句末标点
|
||
- [ ] 提交粒度单一,无无关文件
|
||
- [ ] 无 `.env` / 密钥 / 大文件
|
||
- [ ] PR 描述含背景 / 影响面 / 回滚方式 / 验证证据
|
||
- [ ] CI 全绿,Review 通过,Squash 合并
|