本文定义 legged_rl 及其子仓库的开发、提交、评审和合并流程。参与者提交代码前应阅读本指南;自动化智能体还应遵守根目录 AGENTS.md。
main:生产和发布分支,只包含已发布或可立即发布的稳定版本。每个正式版本必须在此分支创建标签。develop:日常集成分支,包含下一版本已经评审通过的改动。功能分支通常从这里创建并合回这里。feature/<简短描述>:功能、重构、测试和普通文档开发分支,从develop创建,合并回develop。release/v<版本号>:发布准备分支,从develop创建,只接受版本号、文档、发布说明和阻塞性缺陷修复,完成后合并到main,再同步回develop。hotfix/<简短描述>:线上紧急修复分支,从main创建,完成后合并到main,再同步回develop。
分支名使用小写英文和连字符,例如:
feature/add-go2-taskfeature/update-installationrelease/v1.2.0hotfix/g1-joint-limit
一个分支只解决一个主题。功能开发、无关重构和依赖升级应拆分处理。禁止直接向 main 和 develop 推送代码。
普通开发从最新 develop 创建功能分支:
git switch develop
git pull --ff-only
git submodule update --init --recursive
git switch -c feature/<简短描述>开发时遵循以下原则:
- 优先做小而完整的改动,避免无关格式化或重构扩大 diff。
- 遵循目标子仓库已有的格式化、静态检查和测试配置。
- 新增行为应补充相应测试;无法自动测试时,在 PR 中给出可重复的手工验证步骤。
- 公共接口、配置格式、训练参数或默认行为发生变化时,同步更新文档。
- 不提交密钥、机器路径、数据集、模型权重、训练日志、缓存和构建产物。
- 涉及真实机器人或 Sim2Real 的验证必须明确环境、安全措施和操作者授权。
功能代码应提交到对应 fork,而不是只在主仓库中留下未提交的子模块修改。
- 在目标子模块中基于其主分支创建分支并完成修改。
- 在子模块仓库提交、推送并创建 PR。
- 子模块 PR 通过检查和评审后先合并。
- 在本仓库分支中将子模块更新到已合并的提交。
- 提交根仓库的 gitlink 更新,并在 PR 中链接子模块 PR。
检查主仓库和子模块状态:
git status --short
git submodule status
git -C modules/unitree_rl_lab status --short
git -C modules/unitree_rl_gym status --short
git -C modules/unitree_mujoco status --short
git -C modules/deploy status --short根仓库不得引用仅存在于个人本地、临时分支或无法被团队获取的子模块提交。
- 以目标子仓库现有配置为准,不引入第二套冲突的格式化规则。
- 新代码使用清晰的类型、命名和小函数;注释解释原因,不重复代码表面含义。
- 不使用宽泛异常捕获掩盖错误;错误信息应包含定位问题所需的上下文。
- 不无依据地改变随机种子、奖励、观测、动作空间或训练默认值。
- 配置变更应说明兼容性、预期影响和复现实验所需参数。
- 性能或训练效果声明应附任务名、随机种子、硬件、迭代次数和关键指标。
- 大型生成物保存在仓库外部,并在文档中记录获取方式和校验信息。
- 本集成仓库文档默认使用中文;代码标识符、命令和专有名词保持原样。
- 命令示例应可复制,路径应与当前仓库结构一致。
- 修改行为时同步修改相关 README、配置说明或部署文档。
提交信息采用 Conventional Commits 格式:
<类型>(<可选范围>): <简短说明>
示例:
feat(unitree_rl_gym): add Go2 terrain curriculum
fix(unitree_rl_lab): correct G1 joint limit mapping
docs: add submodule development workflow
chore: bump unitree_rl_gym submodule
要求:
- 标题使用祈使语气,清楚说明改动,不以句号结尾。
- 每个提交应是可评审、可回退的逻辑单元。
- 破坏性变更使用
!,并在正文中增加BREAKING CHANGE:说明迁移方法。 - 不提交调试代码、无意义的
WIP提交或混合多个无关主题的提交。 - 合并前可整理提交历史,但不要改写其他人已基于其开发的共享历史。
PR 应保持聚焦,并包含:
- 问题背景和变更目标;
- 主要实现和重要设计取舍;
- 已运行的验证命令及结果;
- 未运行的验证、原因和潜在风险;
- 配置、兼容性、训练效果或部署安全影响;
- 关联 issue、子模块 PR,以及必要的日志、指标或截图。
创建 PR 前:
git diff --check
git submodule status同时运行目标子仓库适用的格式化、静态检查和测试。不要为了通过检查而降低测试强度、屏蔽错误或删除断言。
评审按以下优先级进行:
- 正确性、机器人安全和数据安全;
- 行为兼容性、训练可复现性和子模块提交可获取性;
- 测试覆盖、错误处理和可维护性;
- 性能、代码风格和文档完整性。
作者应回应所有阻塞意见。重要修改完成后重新请求评审;评审者不应批准自己无法理解或无法确认风险边界的改动。
- PR 必须通过必需检查、解决冲突并获得至少一名非作者评审者批准。
feature/*合并到develop默认使用 Squash and merge,PR 标题应符合提交规范。release/*合并到main使用 Create a merge commit,保留清晰的版本发布边界;发布完成后将main同步回develop。hotfix/*合并到main使用 Create a merge commit;修复发布后将main同步回develop。- 不将未经发布准备的
develop直接合并到main。 - 作者不得在存在未解决阻塞意见、失败检查或未知子模块提交时合并。
- 合并子模块更新前,确认对应子仓库提交已进入其受保护主分支。
- 合并后删除已完成的
feature/*、release/*或hotfix/*远端分支。
紧急修复也必须通过 PR。确需缩短评审流程时,应记录原因、风险、回滚方案,并在合并后补齐测试和复盘。
版本号遵循语义化版本 MAJOR.MINOR.PATCH:
MAJOR:存在不兼容的接口、配置、模型或部署行为变更;MINOR:向后兼容的新功能;PATCH:向后兼容的缺陷修复;- 预发布版本使用
-rc.N,例如v1.2.0-rc.1。
本集成仓库以 Git 标签和 GitHub Release 作为版本发布记录。正式标签格式为 vX.Y.Z,必须是指向 main 的 annotated tag。CHANGELOG.md 中的 Unreleased 内容应在发布时归入对应版本,并记录发布日期。
-
从最新
develop创建release/vX.Y.Z。 -
冻结新功能,只处理发布阻塞问题。
-
确认两个子模块均指向可获取、已评审且准备发布的提交。
-
更新
CHANGELOG.md、版本引用和发布文档。 -
完成静态检查、测试以及适用的训练、仿真或部署验证。
-
创建
release/vX.Y.Z到main的 PR,并记录验证证据和回滚方案。 -
合并后在
main的发布提交上创建并推送 annotated tag:git switch main git pull --ff-only git tag -a vX.Y.Z -m "release: vX.Y.Z" git push origin vX.Y.Z -
根据
CHANGELOG.md创建 GitHub Release;发布产物应附来源、兼容性和校验信息。 -
将
main合并回develop,解决版本文件和发布说明差异。 -
验证使用该标签执行
git submodule update --init --recursive能完整获取工作区。
标签一经公开不得移动或覆盖。发布错误应通过新补丁版本修复;不得删除并重建同名正式版本。
从最新 main 创建 hotfix/<简短描述>,完成评审和验证后合并到 main,发布新的 PATCH 版本,再将 main 同步回 develop。不得只修复 main 而遗漏 develop。
在 GitHub 中为 main 和 develop 启用:
- 禁止 force push 和删除分支;
- 必须通过 Pull Request 合并;
- 至少一名审批者;
- 新提交后撤销旧审批;
- 必需状态检查通过后才能合并;
- 必须解决全部 review conversation;
- 自动删除已合并分支。
另外限制 main 只接受 release/* 和 hotfix/* 的 PR,并限制正式版本标签的创建、更新和删除权限。
仓库保护属于 GitHub 设置,本文不会自动启用这些选项,需要仓库管理员配置。