Files
patbond-doc/docs/development/git-workflow.md
T
lixi 8e1fe2f754
CI / docs-build (push) Successful in 44s
chore: 凭证防泄漏检查落地——脚本入库、CI 兜底 step、规范页启用说明(ADR-021)
- 新增 scripts/check-secrets.sh 与 scripts/hooks/pre-commit(与 api/flutter 同构,规则单一来源)
- ci.yml 在 checkout 后新增 Secret scan step;mkdocs build --strict 通过
- git-workflow.md 新增「凭证防泄漏检查」节:两层机制、启用命令、允许清单边界、真凭证轮换优先原则
- 验收:全仓 74 个已跟踪文件扫描零误报

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-08 16:28:04 +08:00

65 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Git 工作流规范
适用于三个仓库:`patbond-api`dev)、`patbond-flutter`dev)、`patbond-doc`main)。
## 分支模型
- **patbond-api / patbond-flutter**`dev` 为集成分支,保持随时可构建(门禁全绿)。日常改动小步直接提交到 `dev`
- **patbond-doc**:直接提交 `main`
- **何时开 feature 分支**:改动跨多天、有破坏性风险(如大规模重构、依赖升级)、或多人并行同一仓库时,从最新 `dev` 拉出 `feat/<主题>` / `fix/<主题>` 分支,完成后合回并删除分支。短命分支,不留长期分叉。
## 提交信息约定
格式:`<前缀>: <中文主题>`,前缀取 `feat` / `fix` / `refactor` / `docs` / `test` / `chore`
- 主题一句话说清做了什么;涉及架构决策时在主题或正文引用 ADR 编号(如 `ADR-005`)。
- 正文用列表写关键改动与**验收证据**(测试数量与结果、门禁命令输出结论),让提交自证可用。
- 一次提交做一件事,可独立回退;不把无关改动混进同一提交。
示例(既有惯例):
```text
feat: 迁移珊瑚橙主题体系并新增认证基础组件(ADR-005)
- 新增 BrandMark/AppTextField 等 5 个组件及 6 个 widget 测试
- 门禁:dart format0 changed/ flutter analyze0 issues/ flutter test7 passed
```
## 禁止事项
- **不提交敏感配置与构建产物**:本地 `application.yml``target/``build/``.dart_tool/``.idea/`、密钥凭据一律不入库(.gitignore 已覆盖,提交前 `git status` 逐一核对暂存清单)。配置只提交 `*.sample`;任何关键/敏感信息只能存在于被忽略的文件或 `.sample` 占位中。
- **不提交测试产生的数据**:测试运行产生的数据文件、数据库导出、临时输出一律不入库。测试代码可以入库,但必须放在标准测试目录(Java 为 `src/test/`Flutter 为 `test/`),不得散落在业务代码目录。
- **不 force push 共享分支**`dev` / `main`)。个人 feature 分支整理历史后如需强推,用 `git push --force-with-lease`
- **不修改已推送的 Flyway 迁移**(呼应开发计划 4.3 节):`V1__*.sql` 等已进入 `dev` 的版本化迁移视为不可变,schema 变更一律新增 `V<n+1>__*.sql`
- 不改写已推送的提交历史(rebase/amend 仅限未推送内容)。
## 凭证防泄漏检查(ADR-021
两层检查共用同一规则表,单一来源为各仓入库的 `scripts/check-secrets.sh`(纯 shell,零外部依赖;三仓副本内容同构,调整规则时三仓同步提交):
1. **本地 pre-commit(推荐,每人每仓启用一次)**
```bash
cd <你的工作区>/<仓名>
git config core.hooksPath scripts/hooks
```
之后每次 `git commit` 自动扫描暂存区内容与文件名。注意 `core.hooksPath` 会整体接管 hooks 目录(当前三仓无其他自定义 hook)。`git commit --no-verify` 可绕过,但仅限确认误报时使用——CI 兜底仍会拦。
2. **CI 兜底(强制)**:三仓 `ci.yml` 在 checkout 后的首个 step 运行同一脚本的 `--all` 模式,对全部已跟踪文件扫描(本次 push 变更文件的超集),命中即红,禁止合入。
规则覆盖(细节以脚本内规则表为准,不在文档重复维护,避免两处漂移):云厂商 AccessKey 形态(AWS/腾讯云/阿里云前缀)、MinIO 默认凭证、独立成行的私钥 PEM 头、access/secret key 与 JWT/签名密钥的实值赋值、配置类文件中非 `${}` 注入形态的数据库口令、`.env`/credentials/密钥导出 CSV 文件本体误入版本库。允许清单:`${}` 注入形态、占位值(changeme、your-xxx、`<占位>` 等)与明显示例值——配置真实值仍只允许存在于被 gitignore 的文件中,占位只进 `.sample`。
手动全量自查:`sh scripts/check-secrets.sh --all`(在仓库根目录执行)。
**拦下真实云凭证后的第一动作是去云控制台轮换/禁用该密钥**,之后才是清理提交历史——只清历史不轮换等于没有处理。
## 提交前本地门禁(未来 CI 将执行同一清单)
| 仓库 | 必跑命令 | 通过标准 |
| --- | --- | --- |
| patbond-api | `JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./mvnw clean test` | BUILD SUCCESS0 失败(需 Docker 供 Testcontainers |
| patbond-flutter | `dart format --output=none --set-exit-if-changed lib test`<br>`flutter analyze`<br>`flutter test` | 0 changed / No issues / All tests passed |
| patbond-doc | `mkdocs build --strict -d <临时目录>` | exit 0,零 warning;不把 `site/` 落进仓库 |
门禁不绿不提交。CI 载体(审计 M3 后半)落地后将原样执行上表命令作为合入门禁。