2026/4/6 17:30:05
网站建设
项目流程
GitLab仓库瘦身实战我是如何用Git LFS把10GB的Unity项目减到1GB的去年接手一个Unity游戏项目时第一次克隆仓库就让我傻眼了——进度条卡在60%整整10分钟最终下载了超过10GB的数据。作为团队的新成员我没想到连入门仪式都如此硬核。更糟的是每次拉取更新都要喝两杯咖啡等待团队协作效率直线下降。经过一周的排查和优化我们成功将仓库体积压缩到1GB左右拉取时间从10分钟降到1分钟。这篇文章就记录这段减肥历程的关键决策和技术细节。1. 问题诊断为什么Unity项目仓库会膨胀打开项目Assets文件夹3D模型、纹理贴图和动画文件占据了90%的空间。这些二进制文件在Git中的存储方式与代码文件完全不同FBX模型文件单个角色模型平均50-100MB版本迭代时整个文件会被重复存储PNG/TGA纹理4K贴图轻松占用20-50MB空间且微小修改就会产生新版本Unity元文件.meta虽然体积小但数量庞大每个资源文件对应一个使用以下命令快速定位仓库中的体积大户git rev-list --objects --all | \ git cat-file --batch-check%(objecttype) %(objectname) %(objectsize) %(rest) | \ awk /^blob/ {print substr($0,6)} | \ sort --numeric-sort --key2 | \ tail -n 20输出结果显示了前20大文件的哈希值、大小和路径。我们发现几个关键问题同一个FBX模型的不同版本在历史记录中保留了完整副本未压缩的PSD源文件被误提交到版本控制废弃的测试资源没有及时清理2. 技术选型为什么选择Git LFS对比了几种解决方案后我们选择了Git LFSLarge File Storage主要基于以下考量因素方案优点缺点适用场景Git LFS无缝集成Git工作流需要额外服务器存储持续更新的二进制文件子模块隔离不同组件依赖管理复杂第三方库/插件仓库拆分彻底分离大文件破坏项目结构静态资源文件浅克隆快速获取最新代码丢失历史记录CI/CD环境Git LFS的核心优势在于它用指针文件替代实际大文件提交时将大文件上传到LFS服务器本地保留轻量级指针拉取时按需下载实际文件内容减少初始传输量版本控制仍然保持完整的修改历史记录对于Unity项目我们确定了需要迁移的文件类型*.fbx *.png *.tga *.psd *.wav *.mp4 *.asset3. 迁移实战五步瘦身方案3.1 准备工作克隆镜像仓库为避免影响正在开发的主分支我们先创建镜像仓库git clone --mirror gitgitlab.com:team/project.git cd project.git注意必须使用--mirror参数完整克隆所有分支和标签3.2 执行迁移重写历史记录使用git lfs migrate命令处理所有分支的历史git lfs migrate import \ --include*.fbx,*.png,*.tga,*.psd,*.wav,*.mp4,*.asset \ --everything这个过程可能会花费较长时间我们的10GB仓库用了约2小时具体取决于仓库的提交次数大文件的数量和体积服务器性能3.3 清理旧数据释放存储空间迁移完成后原始文件仍保留在Git对象数据库中需要手动清理git reflog expire --expirenow --all git gc --prunenow通过du -sh .命令检查仓库大小我们的从10.4GB降到了3.2GB此时还未上传LFS文件3.4 推送变更强制更新远程仓库由于重写了历史记录必须使用强制推送git push --force重要提前通知团队所有成员暂停提交否则会导致代码冲突3.5 配置团队环境统一.gitattributes创建.gitattributes文件并提交到仓库根目录# Unity 3D *.fbx filterlfs difflfs mergelfs -text *.obj filterlfs difflfs mergelfs -text *.blend filterlfs difflfs mergelfs -text # Textures *.png filterlfs difflfs mergelfs -text *.tga filterlfs difflfs mergelfs -text *.psd filterlfs difflfs mergelfs -text # Audio/Video *.wav filterlfs difflfs mergelfs -text *.mp4 filterlfs difflfs mergelfs -text # Unity Assets *.asset filterlfs difflfs mergelfs -text4. 效果验证与性能对比迁移一周后我们收集了团队成员的反馈数据指标迁移前迁移后提升幅度初始克隆时间10分32秒1分15秒84%日常拉取时间2-5分钟10-30秒90%本地仓库大小10.4GB1.2GB88%CI构建时间8分钟3分钟62%特别值得注意的是磁盘空间的节省效果服务器存储从14GB降到5GBGitLab自动压缩LFS文件开发者本地10个成员共节省约92GB空间CI/CD节点每月减少约200GB的传输流量5. 避坑指南迁移后常见问题解决5.1 历史提交显示异常有成员反映某些旧提交显示LFS object not found这是因为该成员本地没有安装Git LFS客户端LFS文件未被自动下载解决方案# 安装Git LFS后执行 git lfs install git lfs fetch --all git lfs checkout5.2 合并冲突处理二进制文件冲突无法像代码一样合并我们制定了新的协作规范美术资源按功能模块分目录管理修改大文件前先在群内通知采用锁定-修改-提交的工作流5.3 CI/CD流水线适配需要在构建脚本中添加LFS支持# Before_script阶段添加 git lfs install git lfs pull对于Docker构建环境基础镜像需要包含git-lfs包FROM alpine:latest RUN apk add --no-cache git git-lfs6. 进阶优化结合Unity的版本控制策略单纯的Git LFS迁移还不够我们进一步优化了Unity项目设置纹理压缩设置- 禁用Generate Mip Maps除非需要LOD - Android/iOS使用ASTC压缩格式 - PC平台使用BC7压缩格式模型导入设置- 开启Mesh Compression - 设置合理的Read/Write开关 - 动画文件使用Humanoid通用骨骼资源组织结构Assets/ ├─ Art/ │ ├─ Characters/ # 角色相关资源 │ ├─ Environments/ # 场景资源 ├─ Audio/ ├─ Prefabs/ └─ Scenes/这些优化使得我们的资源文件体积进一步减小30%也让Git LFS的管理更加高效。现在新成员加入项目时再也不需要经历我当初的10GB克隆噩梦了。