跳转至

Ludo Atlas · 管线 · 版本控制与协作基建

管线与工作流。定位:把代码、二进制资产与场景文件放进同一套版本控制纪律,让合入、回滚与出包都有据可查。 配套:《技术实现手册》·《制作管理手册》·《避坑大全》·《全平台上架手册》。


1. 定位与适用

游戏仓库是三类文件的混合体,它们的版本控制需求互相打架:

文件类型 典型例子 版本控制难点
源码文本 脚本、配置、着色器 可读可合并,基本不添乱
二进制资产 贴图、音频、模型、视频 不可读、不可合并,改动即整体替换
半结构化文件 场景、预制体、蓝图、关卡 名义上可读,合并极容易产生语义损坏

纯代码项目的默认习惯(任意开分支、任意并行、随时合并)在游戏仓库会连环出事:克隆越来越慢,冲突修不动,美术的工作被静默覆盖。这条管线的目标就是把这类事故压到接近零。

命中任意一条信号,就按加强档执行:

  • 仓库超过 1GB,或干净克隆要等好几分钟;
  • 团队里有人从事美术、关卡、音频工作,产物不是代码;
  • 出现过「我的场景被谁覆盖了」「这个资产怎么退不回去」之类的事故;
  • 需要从同一份代码出多个平台、多个渠道的包。

按规模取用:单人项目先把 §3.1 的三份清单立起来;二到十人的团队把 §3.2 到 §3.5 全部落实;十人以上再叠加集中式资产库的文件锁与更严的发布分支纪律。

三条底层原则,后续所有细节都是它们的展开:

  1. 仓库是唯一真源:不在仓库里的改动等于不存在,口头同步不算数。
  2. 可再生成的东西永不进库:缓存、导入中间产物、构建输出一律忽略,它们随时能重建。
  3. 大二进制文件的通道要分开:要么走 LFS,要么放集中式资产库,不能混进普通历史。

2. 工具链

环节 工具 备注
版本控制主体 Git;重资产团队评估 Perforce 一类集中式方案 Git 生态最广;集中式方案自带文件锁,适合美术高频并改
大文件存储 Git LFS 仓库里只留指针,真实内容存在独立存储区
忽略与属性清单 .gitignore 与 .gitattributes 全部规范的载体,随工具与资产格式演进持续维护
引擎集成 引擎内置的版本控制窗口与合并工具 让非程序成员在引擎内完成提交,减少手工操作
提交校验 本地钩子:提交前检查与提交信息校验 拦截缓存文件、超大文件与格式错误
持续集成 托管 CI(Actions、GitLab CI、Jenkins 类) 最终防线:构建、测试、扫描、出包
差异与合并辅助 图形客户端与文本差异工具 降低使用门槛,处理文本类合并
备份 远端镜像加 LFS 对象备份 LFS 内容不在普通克隆里,备份要单独覆盖

选型结论:二到五十人团队,Git 加 LFS 就够;当美术资产到达「多人每天反复改同一批大文件」的密度,再认真评估集中式方案。不要两头各搭一半,迁移成本会翻倍。

3. 流程与规范

日常动作固定为一句话流程:

拉取最新主干 → 开出短周期分支 → 小步提交并自检 → 推送并过合并检查 → 合回主干或打发布标签

3.1 建仓与三份清单

建仓当天写完三份清单,补齐它们的成本会随历史增长:

  • 忽略清单:引擎缓存、导入中间产物、构建输出、日志、本地配置、系统文件。每接入一个新工具或平台,当天补条目。
  • 属性清单:LFS 覆盖的格式、按平台区分的处理规则、声明为二进制的文件类型。按扩展名加路径两个维度写,宁可宽一点。
  • 锁约定清单:哪些文件同一时间只允许一人改动(大场景、关键预制体、核心蓝图),以及加锁与释放的礼仪。工具能自动锁的用工具,不能的写进约定。

3.2 Git LFS 策略

进 LFS 的判断标准:文件不可读、体积大、每次改动整体重写。典型名单:

  • 图形资产:模型、贴图源文件与成品、图集;
  • 音频资产:音频工程、波形、音乐、配音;
  • 视频与动效:过场、宣传素材、序列帧;
  • 引擎二进制资产:引擎原生资产格式与关卡文件;
  • 字体与大型数据表。

不进 LFS 的:脚本、配置、文本文档,以及小体积且频繁改动的文本格式场景文件(文本能顺畅合并时,普通管理反而更快)。LFS 名单写在属性清单里,以 .gitattributes 为准,新增格式先补条目再入库。

历史迁移的纪律:早期用普通提交混进库的大文件,彻底清理要靠重写历史;重写会让所有本地克隆失效,必须安排冻结窗口、全员通告、统一重新克隆。常见折中:只迁移确实超限的目录,接受旧历史保留一部分体积,新资产从当天起全部走 LFS。

LFS 的日常运维:

  • 所有客户端与 CI 都要装好 LFS 并完成拉取,否则拿到的只是指针文件;
  • 托管服务里 LFS 存储按容量与流量计费,大项目提前估算增长率;
  • 备份必须覆盖 LFS 存储区,普通仓库镜像不含真实内容;
  • 新增文件格式进库前,先确认属性清单已覆盖,漏一个扩展名就是一次污染。

3.3 分支策略

主干加短周期功能分支加发布标签,是默认答案:

分支或标记 作用 纪律
主干 唯一集成分支,随时可构建、可运行 不允许长期处于损坏状态,合入前自测通过
功能分支 单个功能或修复 从最新主干开出,寿命以天计,尽快合回
发布分支 冻结候选版本,只收修复 大团队与多平台场景启用,小团队可用标签代替
发布标签 每个对外版本的不可变快照 标签一旦打出不再移动,回滚以标签为准

配套规则:

  • 版本号规则先约定,标签与安装包、商店条目、崩溃报告三方对齐;
  • 切分支可能触发大规模资产重导入,把切换集中到固定窗口,或给美术准备第二份工作副本;
  • 候选包从冻结分支出,验收通过才打标签;标签对应的提交不再接受新改动;
  • 紧急修复从发布标签拉分支,修完同时合回主干,避免修复在下个版本里丢失。

3.4 场景与预制体冲突治理

半结构化文件是事故密度最高的区域,手段按优先级排:

  1. 约定锁:同一场景、同一预制体、同一关键蓝图,同一时间只有一人编辑,改完尽快提交并释放。成本最低,收益最高。
  2. 小步提交:编辑器里每完成一个有意义的改动就提交,把「一天一提交」压成「一小时一提交」,冲突面从整天缩到几分钟。
  3. 拆分结构:大关卡拆成子场景或分块加载,公共部分抽成独立预制体,从结构上减少多人改同一文件的机会。
  4. 引擎工具:合并与冲突处理优先用引擎自带功能,把语义判断交给理解文件格式的那一方;不要手工去缝文本场景的冲突标记,缝出来的文件可能能打开、能运行,但结构已经错了。
  5. 仲裁流程:真撞车时,指定一方放弃本地改动,由另一方按需求重建,比在冲突标记里缝补更便宜也更可靠。

提交场景与预制体时顺带确认两件事:改动是单一意图的小步改动吗?有没有引用到只有本机才有的临时资产?

3.5 提交规范与钩子

提交信息是仓库的叙事层,格式从第一天就用起来:

  • 结构:类型前缀加一句话摘要,正文写清改动的原因与影响面;
  • 类型前缀自定即可(功能、修复、美术、关卡、构建等),关键是全队统一;
  • 一个提交只做一件事,功能改动与全仓格式化不混在同一个提交里;
  • 写结果不写过程,「修复跨天后存档丢失」远好过「改了存档相关的东西」。

钩子的职责分工:

  • 提交前检查:拦截缓存目录与构建产物、超过体积阈值的文件、不该进库的格式;
  • 提交信息检查:校验格式是否符合团队约定;
  • 推送前检查:可选地跑一次快速编译或冒烟测试;
  • 钩子只是本地方便,可以被跳过,永远不能当安全边界;强制力放在 §4 的 CI 里。

提交前自检清单:

  • 改动清单里有没有缓存、日志、临时文件?逐条对照忽略清单。
  • 新增的二进制文件是否已被 LFS 覆盖?
  • 场景与预制体的改动是不是小步的、单一意图的?
  • 提交信息能否让半年后的自己看懂原因?

4. 自动化与验收

4.1 CI 触发点

触发 跑什么 目的
每次推送 提交信息校验、大文件扫描、忽略命中扫描、LFS 指针校验 把违规挡在合入之前
合并请求 编译、自动化测试、资源导入检查 保证主干随时可构建
每日定时 全量构建、多平台打包冒烟 尽早暴露配置漂移
发布标签 正式出包、生成发布附件与校验信息 让标签直接对应可分发产物

4.2 检查点与阈值

检查点 检查方式 参考线 超限处理
仓库体积 定时报告仓库与 LFS 存储增长 增长曲线陡增即预警 定位新增大户,评估迁移
单文件体积 推送时扫描新增文件 超过团队约定阈值 转 LFS 或压缩后重提
缓存与产物 提交路径与忽略清单比对 命中即失败 移除文件并补忽略条目
LFS 覆盖 按属性清单反查新增二进制文件 未覆盖即失败 补属性条目后重新提交
提交信息 格式校验 不符合约定即失败 本地改好再推送

4.3 验收标准

  • 新成员照仓库说明完成克隆与启动,半天以内跑通,不依赖任何口头补充;
  • 任意一个发布标签,都能在一台干净机器上重建出可运行版本;
  • 回滚一次发布在小时级完成,流程至少演练过一遍;
  • 随机抽取若干二进制资产,能从提交历史说清来源、许可与当前版本;
  • 连续一个月没有发生「覆盖他人场景」「大文件污染历史」类事故;发生一次,回到第 3 节补规范。

度量让讨论有依据:仓库体积、克隆耗时、冲突次数、LFS 流量,每月看一次,异常波动比绝对值更重要。

5. 常见坑

  1. 缓存与构建产物进库:引擎缓存、导入中间层、打包输出被提交,仓库迅速膨胀,团队互相覆盖可再生成的文件。建仓当天把忽略清单写全。
  2. 大文件历史污染:资产先以普通提交进库,等发现时历史已经背着几十个版本的大文件,越晚处理越贵(迁移策略见 §3.2)。
  3. 忽略设置滞后:新装工具、新接平台,忽略清单没跟上,垃圾文件一批批混进来。补清单与工具接入同一天完成。
  4. 把二进制资产当文本管:不设锁、不禁并行,两人同改一个源文件,先推送的版本把后者的工作静默覆盖。
  5. 手工合并文本场景:对着节点标识缝冲突标记,结果能打开但结构已错,代价远高于重建。
  6. 长期功能分支:分支悬空数周,合入当天变成大爆炸集成。分支寿命以天计是有原因的。
  7. 提交信息空洞:满屏「更新」「修复」,出问题时无法定位也无法回退。
  8. 只有本地钩子没有 CI:钩子可以被跳过,也可以根本没装,把校验全押在本地等于没有校验。
  9. LFS 只管提交不管运维:新成员克隆拿不到真实文件、配额见底、备份没覆盖 LFS 存储,问题会在半年后集中爆发。
  10. 凭据混进历史:令牌、密钥、账号写进配置并提交,删除文件并不能删除历史;凭据必须轮换,历史要么重写要么承担风险。

延伸阅读

  • 《技术实现手册》:工程基建与资产管线的完整展开,本文是其版本控制部分的落地版。
  • 《制作管理手册》:协作规范、QA 与发布流程的上位框架,团队规模与规范强度如何匹配看这里。
  • 《避坑大全》:版本控制与协作相关坑位的合集与分级,里程碑评审时对照。
  • 《全平台上架手册》:出包与发布流程,发布标签与构建流水线的下游。
  • 同区邻居:《Mod 与 UGC 手册》与《联机与后端深入手册》是本管线的已发布邻居页,可对照各自的协作与工具章节。