1. 建立工程目录
- 使用项目工程组织,来管理整体的文件目录
工程名字叫做AiGame,使用下面的工程目录,先建立这样的文件夹结构
AiGame/
├── Houdini/
│ ├── backup/
│ ├── examples/
│ ├── geo/
│ ├── packages/
│ │ ├── AiGame
│ │ ├── AiGamePackage.json
│ ├── AiGame.hip
├── Resources/
│ ├── 3DModels/
│ ├── Reference/
│ ├── ScansLibrary/
│ └── Textures/
├── SourceContent/
│ └── AiGame/
│ ├── Foliage
│ ├── Landscape
│ └── Textures
├── TutorialFile/
├── Unreal/
│ ├── Config/
│ ├── Content/
│ ├── DerivedDataCache/
│ ├── Intermediate/
│ ├── Plugins/
│ ├── Saved/
│ ├── Source/
│ └── AiGame.uproject
└── README.md这里Houdini后面用,先放着
2. Git托管项目
- 初始化项目
目前为止,本地的项目目录就完成了,但是我们还想要
- 版本管理
- 远程托管和备份
考虑到游戏项目会有很多比较大的二进制文件,所以需要找一个免费容量比较大的代码托管平台,而且网络畅通。对比了几个主流的
- Github:网络不行
- Gitee:单仓库免费容量只有500mb
- CNB:网络畅通,组织Git免费100GB,对象存储100GB,还有免费的CPU和GPU核时方便做CI/CD和云IDE。
综上所述,腾讯旗下的CNB - Cloud Native Build完胜。
建立云端仓库
- 首先我们现在cnb创建一个组织
- 然后在组织下面创建一个仓库,名称就可以叫做AiGame
- 得到地址https://cnb.cool/<组织名称>/AiGame
- 然后创建一个仓库令牌,记住GitUserName和Token下一步要用
初始化本地仓库
首先安装Git,可以去官网找到对应版本:Git 对应的可以安装GUI图形化界面Sourcetree | Free Git GUI for Mac and Windows 然后去到项目的根目录,右键打开git bash,输入一下命令
- git init . 该命令用于在当前所在的本地目录初始化一个全新的Git仓库。执行后,会在当前目录下创建一个隐藏的
.git文件夹,这个文件夹存储了Git仓库的所有元数据(如版本历史、分支信息、配置等),标志着当前目录正式成为Git可管理的仓库,后续可在此目录下进行代码的提交、分支管理等Git操作。 - git remote add origin https://cnb.cool/<组织>/AiGame 此命令的作用是为本地初始化的Git仓库添加一个远程仓库的关联,其中“origin”是远程仓库的默认别名(后续操作中可通过该别名指代对应远程仓库,无需重复输入完整URL)
- git config —local user.name HartHat 该命令用于配置当前本地Git仓库(—local参数指定配置作用域为当前仓库,仅对该仓库生效)的用户名称为“HartHat”。Git在记录代码提交历史时,会将该用户名与提交操作关联,便于识别每次提交的操作者,是Git提交代码的必要配置之一。
- git config —local user.email “ZMiOkQCe02Ei1BYH3ARfUJ+HartHat@noreply.cnb.cool” 与上一条命令类似,此命令用于配置当前本地Git仓库的用户邮箱为,同样会被记录在提交历史中,且通常用于Git平台(如该远程仓库所属平台)的身份关联、通知推送等功能,也是Git提交代码的必要配置。 这里随便配置默认给的也可以用自己真实的邮件。
- git config credential.helper store 该命令用于配置Git的凭证辅助工具为“store”模式。在Git与远程仓库通过HTTPS协议交互时,通常需要输入用户名和密码(或访问令牌)进行身份验证,配置此模式后,Git会将输入的凭证(用户名+密码/令牌)存储在本地(默认存储路径多为用户目录下的
.git-credentials文件),后续再次与该远程仓库交互时,无需重复输入凭证,可自动读取存储的凭证完成验证,提升操作便捷性。
推送本地修改到远程仓库
- 接下来我们先修改一下根目录下README.md文件,写一个简单项目介绍。

- git add README.md 将此文件加入git stage
- git status 查看当前文件状态

- 可以看到reademe已经加入stage,等待推送,但是其他文件都还未被管理。
- git commit -m 初始化项目 提交第一个项目更改
- git log 可以看到提交树
- git push —set-upstream origin master 把当前master分支推送到origin并设置其为upstream
- 这时候会弹窗需要令牌,输入我们之前在cnb网站上申请的令牌。

- 完成,去到网页https://cnb.cool/<组织名称>/AiGame可以看到我们的文件已经上传了服务器

- 接下来我们把工程文件目录都推送到服务器,如果文件夹里面是空的,可以建立一个空的txt文本占位,方便下面进行git操作。
- git add . 把所有文件加入git stage

- git commit -m 初始化项目结构 然后git push 到远端服务(这里缺失了Unreal文件夹,是因为里面是空的, 下一步我们创建Unreal工程来填充它)
Git Tips:
- 永远可以建立一个分支的备份来做操作,操作错了就切换分支就好了。
- 详细的Git教程可以看 Pro Git(中文版)
- 网页版Learn Git Branching 学习
3. 初始化Unreal项目文件
- 安装visual studio
- 创建一个第三人称项目
- 使用Git配合LFS来完成项目托管服务。(需要一个在线服务器能够支持我的文件托管
- LFS管理
编程环境
先安装一个编程环境和ide:
- 下载visual studio 2022: 免费的开发人员软件和服务 - Visual Studio
- 如何配置VS:为虚幻引擎C++项目设置Visual Studio开发环境 | 虚幻引擎 5.6 文档 | Epic Developer Community
- VS中Unreal使用技巧:虚幻引擎Visual Studio使用技巧 | 虚幻引擎 5.6 文档 | Epic Developer Community
- VS中介绍UnrealEngine:在 Visual Studio 中打开 Unreal Engine 项目 | Microsoft Learn
创建UE项目
UE创建一个项目, 本地运行一下就ok。为了方便起见,就用新版本5.6
- 去官网下载EpicLuncher启动器:最强大的实时3D创作工具 - Unreal Engine
- 找到引擎,下载Unreal最新版本的引擎,并且启动

- 选择第三人称模板,C++项目,位置是选择一个临时位置,不要选择项目文件夹,名称是AiGame
- 确定后编辑器和vs都会打开
- 点击Play,可以看到简单的第三人称游戏就开始了

- 然后我们把临时文件夹里面的所有内容拷贝到项目下面Unreal文件夹下:(拷贝后可以再运行一遍AiGame.uproject确保一切正确)
AiGame/
├── Unreal/
│ ├── Config/
│ ├── Content/
│ ├── DerivedDataCache/
│ ├── Intermediate/
│ ├── Plugins/
│ ├── Saved/
│ ├── Source/
│ └── AiGame.uproject关于更多UnrealEngine的文档和帮助可以见 入门指南 | 虚幻引擎 5.6 文档 | Epic Developer Community
更新文件到Git
我们打开SourceTree,可以看到多了一千多个文件在Unreal目录下,其中有些我们并不想进行版本管理和上传服务器,他们可能是一些缓存和编辑器本地文件。

- 此时,需要配置一个gitignore文件来告诉git那些符合哪些规则的文件不被管理。
- 可以去网上搜索一个模板比如GitHub - Cowland-Game-Studios/Unreal-Git-Ignore-and-Attributes-Template.,或者github官方gitignore/UnrealEngine.gitignore at main · github/gitignore · GitHub。我们把仓库里面gitignore文件和gitattributes文件拷贝到本地根目录。
- 此时git 追踪的unstage的文件数量减少到800多个。
- 这里提到LFS,是的,我们除了屏蔽文件,我们还需要用gitattributes文件标识LFS管理的二进制文件。比如图片声音Uasset这些文件可能很大,不适合进行git管理。关于LFS介绍可以看Git LFS 操作指南 - Gitee.com
- git lfs install 首先初始化一下lfs。(这个操作是全局的,如果本地电脑已经配置过LFS 就不需要每个项目都执行)
- git add . 确保所有通过筛选的文件都正确加入stage
- git lfs ls-files 查看当前正在被追踪的lfs文件
- 没有add到stage的新文件是看不到的
- 如果有文件已经commit了,后来才想转为lfs,那么要更新
git lfs track再用git lfs migrate import --include-ref=master --include="*.<文件后缀>"然后强制推送git push origin master --force
- 可以看到非lfs文件是正常的,lfs文件是一个hash值

- git commit -m 加入Unreal项目 这样我们就完成了一个基本unreal项目的git管理
- git push 推送到远端
我们可以看到gitbash里面推送的详情:
本地master分支就推送到远端master分支
我们也可以在web查看

控制lfs历史长度:虽然lfs在git里面只有一个小文本的指针用来指向实际文件,但是我们还是关心如果大文件版本数量过多,会不会爆仓,如何定期减少一些历史记录呢。
本地:
# 1.列出所有 LFS 对象(确认要删除的版本)
git lfs ls-files --all
# 2.删除特定文件的旧版本(需 LFS 服务器权限)
git lfs prune --verbose --verify-remote --force \ --older-than="2 years" # 保留近2年版本远程: 仓库会自动 GC 清除那些“真的”可以清除的,不存在任何历史提交里面的 lfs 文件。所以可以清除不用的lfs文件提交一次,然后合并所有历史提交。之后等cnb自动GC。
#这样合并历史提交
git reset --hard HEAD~总提交数-1
git merge --squash HEAD@{1}
git commit -m "Update"
git push --forceWarning
- 对于包含LFS的Commit,最好保证每个都是将来可能会回滚有用的,否则就合并Commit。减少不必要的存储。
- 最好每个功能和修改都单独拉一个分支出来操作,确认当前小版本可运行后再合入主分支
4. 测试从UE直接进行版本管理
- 从unreal editor修改文件并且直接提交
使用git进行代码的文件管理我们都很熟悉了,对于二进制文件我们使用了lfs,那么直接用unreal的git版本控制可以方便的进行文件管理吗。这里进行一个测试。
首先我们在ue编辑器右下可以找到版本控制,开启unreal内的git版本控制:
这时候我们可以直接在UE里面对资产进行Git控制
测试一下
首先找到场景中绿色物体的材质实例
把他修改成紫色的。保存。
使用git没有changelist的概念,目前ue客户端也不支持git控制下的changelist。使用p4可以用不同的changelist来保存不同的文件修改。

所以我们修改了文件后直接点击submit
然后提交看看
sourcetree可以看到提交commit。
可以看到Unreal对Git的支持聊胜于无。还是不如直接用Git软件来操作把。如果我们想要回退,记得首先关闭Unreal编辑器,操作完再打开即可回退到上一版本。
Tips: 对于个人来说,目前用git+git lfs 足够做一个版本控制和云端备份了。对于团队来说,二进制文件还是建议用Perforce来管理。
其他
拓展阅读: