Files
starmen1265 b2820ec024 docs(workflow): 建立问题管理三段式工作流与经验知识库
- 新增 problem-solving skill:固化「问题分析→工作记录→知识沉淀」9步流程与3模板
- 新建 docs/knowledge/ 经验知识库(README/INDEX/临时方案登记/坑-UE5引擎含2条迁移示例)
- GIT-GUIDE 补 §2.7 临时代码 [TEMP-INVESTIGATE] 约定、§2.8 fix 提交引用 issue
- CLAUDE.md 项目管理段加问题管理引用
- 配套 Gitea 标签 type:bug / type:investigation(后台已建)
2026-07-16 19:19:59 +08:00

335 lines
9.3 KiB
Markdown
Raw Permalink 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.
# ChildHood - Git 规范
> 本文档规定 ChildHood 项目的 Git 分支策略和提交规范。
> 适用场景:单人独立开发 + UE5.7.4
---
## 一、分支策略
采用 **develop 长期开发分支模型**,适合单人开发 + 多 AI Agent 协作场景。所有 agent 在 `develop` 上工作,迭代结束时通过 PR 合并回 `main`。
### 1.1 分支总览
```
main ──────────── 永远可玩可编译,受保护,禁止直接推送
│
│ PR (Gitea) ← 里程碑/迭代结束时,PM 发起
│
└── develop ──── 长期分支,所有 agent 的日常工作分支
│
├── 程序1 提交代码
├── 策划 提交文档
├── 程序2 提交代码
└── 迭代就绪 → PR develop→main
```
### 1.2 分支类型
| 分支 | 用途 | 生命周期 |
|---|---|---|
| `main` | 稳定可玩版本,受保护 | 永久 |
| `develop` | 日常开发,所有 agent 共用 | 永久 |
| `prototype/` | 技术验证、玩法实验 | 实验完即删 |
| `release/` | 版本发布标记,只从 main 切出 | 永久保留 |
### 1.3 工作流程
```
1. 开始工作(agent 自动执行)
bash .claude/scripts/git-workflow.sh ready
2. 开发并提交
bash .claude/scripts/git-workflow.sh commit <type> <scope> "描述"
3. 推送到远程
bash .claude/scripts/git-workflow.sh push
4. 迭代完成,PM 创建 PR
bash .claude/scripts/git-workflow.sh release "迭代名称"
5. 用户在 Gitea 合并后同步
bash .claude/scripts/git-workflow.sh post-release
```
### 1.4 核心原则
- **`main` 永远可玩**:通过 develop → main PR 合并,不直接推送
- **develop 是工作台**:所有 agent 在 develop 上并行工作
- **不同文件不冲突**:各 agent 修改不同文件,可真正并行
- **同一文件需协调**:两个 agent 修改同一文件时需顺序执行
---
## 二、提交规范
### 2.1 提交消息格式
```
<type>(<scope>): <subject>
<body>(可选,多行说明)
```
- **subject**:不超过 50 个字符,简明扼要
- **body**:每行不超过 72 个字符,解释"做了什么"和"为什么"
- 使用中文描述,技术术语保留英文
### 2.2 Type 类型标签
| Type | 含义 | 使用场景 |
|---|---|---|
| `feat` | 新功能 | 新增系统、机制、玩法 |
| `fix` | Bug 修复 | 修复已知问题 |
| `art` | 美术资源 | 模型、贴图、材质、动画导入 |
| `level` | 关卡/场景 | 关卡搭建、场景编辑 |
| `audio` | 音效/音乐 | BGM、SFX、语音导入 |
| `bp` | 蓝图逻辑 | 蓝图节点修改、逻辑调整 |
| `refactor` | 重构 | 不改变功能的结构优化 |
| `config` | 项目配置 | 引擎设置、插件配置、项目参数 |
| `docs` | 文档 | README、设计文档、注释 |
| `wip` | 进行中 | 未完成的工作进度保存 |
### 2.3 Scope 范围标签(可选)
按游戏系统或模块划分:
```
player 玩家角色
enemy 敌人/AI
combat 战斗系统
ui UI 界面
camera 摄像机
inventory 背包/物品
dialogue 对话系统
quest 任务系统
save 存档系统
audio 音频系统
animation 动画系统
ai AI 行为树/状态机
level 关卡
vfx 视觉特效
```
### 2.4 提交示例
```bash
# 新功能
git commit -m "feat(player): 实现角色跳跃和二段跳"
# 带 body 的详细提交
git commit -m "feat(combat): 实现基础连击系统
- 添加三段连击动画蒙太奇
- 实现动画通知触发伤害判定
- 连击窗口时间可配置"
# Bug 修复
git commit -m "fix(camera): 修复穿墙时摄像机卡顿问题"
# 美术资源
git commit -m "art(environment): 添加草地和树木模型"
# 蓝图修改
git commit -m "bp(enemy): 实现巡逻-追击-攻击状态机"
# 关卡搭建
git commit -m "level(chapter1): 第一章关卡白盒搭建完成"
# 进行中
git commit -m "wip(crafting): 合成系统UI初步框架"
# 项目配置
git commit -m "config: 启用Nanite和Lumen,设置画质预设"
# 重构
git commit -m "refactor(inventory): 拆分背包数据层与UI层"
```
### 2.5 提交粒度建议
| 操作 | 粒度 |
|---|---|
| 蓝图逻辑 | 按功能点提交,不要一次提交多个系统 |
| 关卡编辑 | 按区域/房间提交 |
| 美术资源导入 | 按类型/角色分批提交 |
| C++ 代码 | 按逻辑单元提交 |
| 材质/贴图 | 按材质组提交 |
### 2.6 UE5 特别注意
- **蓝图与 C++ 分开提交**:避免同一提交中混合两者,方便出问题时 revert
- **二进制文件提交**:`.uasset`、`.umap` 无法 diff,commit message 要写清楚改了什么
- **不要提交以下目录**(已被 .gitignore 排除):
- `Binaries/`、`Intermediate/`、`Saved/`、`DerivedDataCache/`
- `.vs/`、`*.sln`(由引擎自动生成)
### 2.7 临时代码与调查脚本(验证完即删)
排查问题时往往需要写临时验证代码、测试脚本、一次性工具。约定如下(详见 `problem-solving` skill):
- **默认不进仓库**:临时代码只在本地 / 临时分支跑,验证完删除。
- **若必须 commit**(如要在 UE5 里跑):用 `wip` 类型,message 标注 `[TEMP-INVESTIGATE: issue#XX]`,验证后 `git revert` 或删除该 commit。
- **文件标记**:文件名前缀 `tmp_` / `dev_`,文件头注释 `// [TEMP-INVESTIGATE: issue#XX] 验证后删除`。
- **清理检查**:关闭 issue 前执行 `grep -r "TEMP-INVESTIGATE" Source/ tools/`,确认无残留。
- **保留什么**:结论 + 关键代码片段以代码块形式写入 issue 评论,**不保留可运行文件**。
> 原则:删除的是 artifact,保留的是 insight。
### 2.8 fix 提交引用 issue
Bug 修复 / 问题排查类提交,在 body 里引用对应 Gitea issue 号,便于溯源:
```bash
git commit -m "fix(camera): 修复穿墙时摄像机卡顿问题
issue #42"
```
---
## 三、版本号规范
采用简化语义化版本:
```
v主版本.次版本.修订号
v0.1.0 ← 第一个可玩原型
v0.2.0 ← 核心玩法成型
v0.3.0 ← 内容填充阶段
...
v1.0.0 ← 正式发布
```
- **主版本**:重大里程碑(原型、Alpha、正式版)
- **次版本**:新系统/大功能完成
- **修订号**:Bug 修复、小调整
---
## 四、常用命令速查
```bash
# 查看当前状态
git status
git log --oneline --graph --all
# 开始新功能
git checkout -b feature/xxx
# 暂存当前工作(需要临时切分支时)
git stash
git stash pop
# 撤销上次提交(保留修改)
git reset --soft HEAD~1
# 强制同步远程(仅限个人项目)
git fetch origin
git reset --hard origin/main
```
---
## 五、远程仓库配置
### 5.1 服务器信息
| 项目 | 值 |
|---|---|
| 平台 | Gitea(自建) |
| HTTP 地址 | `http://192.168.1.22:8418/starmen1265/ChildHood.git` |
| SSH 地址 | `ssh://sc-gitea@192.168.1.22:2223/starmen1265/ChildHood.git` |
| SSH 端口 | `2223`(非默认 22) |
| SSH 用户名 | `sc-gitea`(非默认 `git`) |
### 5.2 SSH 配置
#### 生成密钥(ED25519,推荐)
```bash
ssh-keygen -t ed25519 -C "starmen1265@163.com" -f ~/.ssh/id_ed25519 -N ""
```
> ⚠️ 优先使用 ED25519 而非 RSA。部分 Git 服务器对 RSA 密钥兼容性较差。
#### 添加公钥到 Gitea
1. 查看公钥:`cat ~/.ssh/id_ed25519.pub`
2. 复制完整输出
3. 登录 Gitea Web UI → 设置 → SSH/GPG 密钥 → 添加密钥
4. 粘贴公钥内容,保存
#### 设置远程地址
```bash
# 查看当前远程地址
git remote get-url origin
# 切换到 SSH(注意用户名是 sc-gitea,端口是 2223)
git remote set-url origin ssh://sc-gitea@192.168.1.22:2223/starmen1265/ChildHood.git
```
### 5.3 常见问题排查
#### ❌ `Host key verification failed`
首次连接服务器需要信任主机密钥:
```bash
ssh-keyscan -p 2223 192.168.1.22 >> ~/.ssh/known_hosts
```
#### ❌ `Permission denied (publickey)`
排查步骤:
```bash
# 1. 测试 SSH 连接,查看详细日志
ssh -vvv -p 2223 sc-gitea@192.168.1.22 "exit"
# 2. 检查密钥是否被 offer
# 在日志中找 "Offering public key" 行
# 确认使用了 id_ed25519 而不是 id_rsa
# 3. 对比本地和服务器的密钥指纹
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 然后到 Gitea Web UI → 设置 → SSH/GPG 密钥 查看指纹是否一致
```
常见原因:
| 原因 | 解决方法 |
|---|---|
| 远程地址用了 `git@` 而非 `sc-gitea@` | 改用正确的用户名(见 5.1) |
| SSH 端口用了默认 22 而非 2223 | URL 中指定端口 `ssh://sc-gitea@host:2223/...` |
| RSA 密钥被服务器拒绝 | 重新生成 ED25519 密钥 |
| 公钥未添加到 Gitea | Web UI → 设置 → SSH/GPG 密钥 → 添加 |
| 公钥格式不完整 | 确保从 `ssh-ed25519` 复制到字符串末尾,无截断 |
#### ❌ `Authentication failed`(HTTP 方式)
HTTP 方式需要用户名密码认证,建议切换到 SSH:
```bash
git remote set-url origin ssh://sc-gitea@192.168.1.22:2223/starmen1265/ChildHood.git
```
#### 🔧 SSH 使用了错误的密钥
如果服务器同时有 RSA 和 ED25519 密钥,SSH 可能优先尝试 RSA。可以指定密钥:
```bash
# 单次指定
git -c core.sshCommand="ssh -i ~/.ssh/id_ed25519 -p 2223" push origin main
# 或全局配置(推荐)
# 编辑 ~/.ssh/config,添加:
Host 192.168.1.22
Port 2223
User sc-gitea
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
```