Unity中Git使用指南
翻译:http://gad.qq.com/program/translateview/7188118
原址:https://www.gamasutra.com/blogs/TimPettersen/20161206/286981/The_complete_guide_to_Unity__Git.php
Git是一个免费和开源的版本控制系统,你可以使用Git轻松的追踪到你Unity项目的更新,并与开发人员,美工,设计师或者其他参与游戏开发人员在相同的代码基础上进行合作。目前超过69%的软件行业在使用Git,最近通过对Git的改进,使得Git可以处理unity中assets目录下更大的资源文件,所以越来越多的游戏工作室从Perforce和Subversion迁移到Git。 本文将教你如何在Unity项目使用Git,并且可以用Git LFS有效地跟踪大量assets目录下的文件(如纹理和音频),并使用免费的Bitbucket和Unity Cloud Build帐户构建你的代码。
Unity .gitignore
Unity、和脚本集成开发环境(如MonoDevelop,Consulo,Rider和Visual Studio)、创建临时文件,构建资产文件,日志文件和其他自动生成的项目文件都不适合检查版本控制。跟踪这些文件伴随着Git仓库大小的膨胀,当多个开发人员在同一个项目,可能会导致可怕的冲突。你可以通过在项目目录中检查特殊的.gitignore文件来让Git忽略这些文件:
#.gitignore
#Unity
/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*
sysinfo.txt
*.pidb.meta
#VS/Rider/MD/Consulo
ExportedObj/
.consulo/
.idea/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
#Builds
*.apk
*.unitypackage
*.app
*.exe
基于gitignore.io生成的Unity .gitignore规则,也可以自己添加了几个。
这个.gitignore文件应该存放在你的Unity游戏目录中(Assets目录和ProjectSettings子目录的直接父目录),即使Unity游戏目录不是Git仓库的顶层目录。
如果你的操作系统还没有添加维护.gitignore规则的特殊文件,那么你应该添加 special filesmaintained by your operating system。
Unity中设置Git的版本控制
Unity有进行几个设置,版本控制模式设置和资产序列化模式设置,强制scenes,prefabs, 和meta文件以Git识别的格式写入磁盘:
导航到 编辑>项目设置>编辑器 并设置:
版本控制>模式到可见meta文件
这个设置让Unity将.meta资源文件作为正常的,非隐藏文件写入到你的Assets目录。
资源序列化>强制文本的模式
这使得Unity将会序列化Unity生成的文件为YAML(文本)而不是二进制格式文件。基于文本的文件格式使Git可以自动合并多个开发人员所做的更改,而对二进制文件的多个更改后不会自动合并,因为合并时始终会发生冲突。
启用这些设置后,应保存项目,并将更改提交到git仓库中。你的设置将保存在ProjectSettings / EditorBuildSettings.asset中,并作为仓库的一部分进行并发,因此你团队中的其他开发人员不需要进行相同的更改。
在Git中处理大量Unity assets文件
Git是一个分布式版本控制系统,这意味着在克隆过程中,仓库的整个历史资源(即每个资源的每个版本)都是从服务器复制过来的。如果你想要在源代码版本中管理游戏中大的资源文件(如spritesheets,高分辨率纹理,复杂模型或音频和视频文件)这是有问题的。因为一个10MBspritesheet当你第一次提交它可能不是一个大问题,但每次修改它,就有另一个10MB被添加到你的存储库,这意味着一个额外的10MB文件大家都需要下载。
Git LFS 是一个打破Git的“分布式”性质的扩展,通过只下载某些当你真正想要使用的大文件。默认情况下,Git LFS只在最初从服务器克隆仓库时下载每个大资源文件的最新版本。当你切换分支,把服务器仓库的更新拉到本地仓库或回溯到更早版本时,将从服务器自动提取所有所需的资产。
一旦你安装了Git LFS,你通常可以使用git lfs track命令来让Git使用LFS跟踪哪些文件。 这会添加新的LFS过滤器并绑定到你的.gitattributes文件,该文件应作为你的本地仓库的一部分进行提交和分布。你可以添加自己的定义,一个好的经验法则是,任何超过500KB的二进制文件都应该使用LFS进行跟踪,或者你可以在仓库的根目录中创建一个名为.gitattributes的文件,并复制此预定义的定义集进去:
#.gitattributes
#Images
*.jpgfilter=lfs diff=lfs merge=lfs -text
*.jpegfilter=lfs diff=lfs merge=lfs -text
*.pngfilter=lfs diff=lfs merge=lfs -text
*.giffilter=lfs diff=lfs merge=lfs -text
*.psdfilter=lfs diff=lfs merge=lfs -text
*.aifilter=lfs diff=lfs merge=lfs -text
*.tiffilter=lfs diff=lfs merge=lfs -text
*.cubemapfilter=lfs diff=lfs merge=lfs -text
#Audio
*.mp3filter=lfs diff=lfs merge=lfs -text
*.wavfilter=lfs diff=lfs merge=lfs -text
*.oggfilter=lfs diff=lfs merge=lfs -text
#Video
*.mp4filter=lfs diff=lfs merge=lfs -text
*.movfilter=lfs diff=lfs merge=lfs -text
#3D Objects
*.FBXfilter=lfs diff=lfs merge=lfs -text
*.fbxfilter=lfs diff=lfs merge=lfs -text
*.blendfilter=lfs diff=lfs merge=lfs -text
*.objfilter=lfs diff=lfs merge=lfs -text
#Other
*.afilter=lfs diff=lfs merge=lfs -text
*.exrfilter=lfs diff=lfs merge=lfs -text
*.tgafilter=lfs diff=lfs merge=lfs -text
*.pdffilter=lfs diff=lfs merge=lfs -text
*.zipfilter=lfs diff=lfs merge=lfs -text
*.dllfilter=lfs diff=lfs merge=lfs -text
*.aiffilter=lfs diff=lfs merge=lfs -text
*.ttffilter=lfs diff=lfs merge=lfs -text
*.rnsfilter=lfs diff=lfs merge=lfs -text
*.reasonfilter=lfs diff=lfs merge=lfs -text
*.lxofilter=lfs diff=lfs merge=lfs -text
基于由 nemotoo定义的Unity.gitattributes规则,也可以自己添加了几个。
请注意,你也可以根据通配符或目录名称定义模式。例如git lfs track“Assets / Textures”,但是这不是一个好的方法,因为它会导致Git LFS跟踪基于文本的.meta文件。
使用UnitySmartMerge合并游戏资源文件
将资源序列化模式设置为强制文本后,Git可能会自动将不同开发人员所做的一些更改合并到.scene和.prefab文件中。但是如果你仍然看到合并冲突,不要绝望,Unity自带了一个名为SmartMerge的Git兼容的合并工具。
要启用SmartMerge,你需要将以下代码段添加到Git配置中。对于只有一个存储库,将其添加到存储库*目录中的.git / config文件。要为系统上的所有仓库启用SmartMerge,你需要将其添加到全局Git配置。位置不同,在MacOS和Linux上通常是〜/.gitconfig,但是你可以简单地运行git config --global -e在系统编辑器中打开它。
[mergetool"unity_yaml"]
cmd= '/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge' merge -p"$BASE" "$REMOTE" "$LOCAL" "$MERGED"
trustExitCode= false
keepTemporaries= true
keepBackup= false
[merge]
tool= unity_yaml
在Windows上,将'/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge'替换为:
'C:\Program Files \ Unity \ Editor \ Data \ Tools \ UnityYAMLMerge.exe'
或者你已经安装Unity的地方。
这些属性的简单解释:
1)cmd= ...是用来调用UnityYAMLMerge的路径和参数(实现SmartMerge的二进制文件)
2)trustExitCode= false表示Git不使用来自UnityYAMLMerge的退出代码来确定合并是否成功
3)keepTemporaries= true意味着Git保留一些临时文件,如果UnityYAMLMerge出现错误而导致合并失败,这些临时文件对可以用来进行调试。
4)keepBackup= false表示Git在解析后,丢弃冲突文件的.scene.orig或.prefab.orig备份。由于通常有多个开发人员在同一个scene文件上工作,你很可能会遇到冲突,导致在你的仓库中有很多垃圾备份。最好的方法就是自动丢弃它们。如果需要,你也可以手动重新创建它们。
下次遇到Git无法自动解决的冲突时,运行:
$ gitmergetool
SmartMerge将(希望)为你解决它。 例如:
$git merge feature1
Auto-mergingAssets/Scenes/GameOver.unity
CONFLICT(content): Merge conflict in Assets/Scenes/GameOver.unity
Automaticmerge failed; fix conflicts and then commit the result.
$git mergetool
Merging:
Assets/Scenes/GameOver.unity
Normalmerge conflict for 'Assets/Scenes/GameOver.unity':
{local}: modified file
{remote}: modified file
Conflicts:
Conflicthandling:
Assets/Scenes/GameOver.unityseems unchanged.
Wasthe merge successful [y/n]? y
注意,有时候,冲突已成功解决,而Git却认为文件并没有改变,所以需要测试,请尝试在Unity中打开冲突的文件。如果它真的没有改变,仍然有冲突标记,它将无法打开。如果它成功打开,你可以检查在Unity Inspector中合并的结果(它应该有合并的新值),然后正常提交。
从其他版本控制系统迁移Unity项目
不管你的工具链,你肯定不是第一个从当前版本控制系统转到Git版本控制,几乎每个版本控制系统都可以想象出专用的导入器。使用导入器的优点是,在切换到Git时可以保留现有的提交和分支历史记录。Atlassian有关如何从SVN迁移到Git或者从Perforce迁移到Git的指南,还有许多其他指南和工具供其他版本控制系统使用。
如果你的版本控制历史中有大量资源,那么它们将与其他项目文件一起转换为Git,并直接存储在你的仓库库中。如上面关于处理大资源的部分中所讨论的那样,这可能产生巨大的仓库容量,将需要相当多的时间来克隆,推送和拉取。为了保持你的仓库精简,你应该重写你的历史记录以使用Git LFS来跟踪这些大型资源。如果你从Perforce迁移,Git LFS实际上支持内置在git p4 command命令中。如果要从SVN(或任何其他版本控制系统)迁移,通常需要在使用git-lfs-migrate等工具初始迁移到Git之后,再将历史迁移到Git LFS上。
托管、构建你的Unity项目
Git是分布式的,所以你总是在本地有你的项目的完整历史,但你仍然需要一个集中式主机来备份你的仓库并与他人合作。Bitbucket提供无限制的私人仓库,支持Git LFS(包括免费存储层),可免费为五个用户使用,这使得它成为许多独立游戏工作室的理想选择。如Ubisoft和SEGA使用Bitbucket作为游戏开发软件。
你可以免费注册Bitbucket,或者在Bitbucket上演练你的第一个Unity项目,你可以按照官方教程,在Unity3D中开始使用Bitbucket和SourceTree。
在Bitbucket上托管你的游戏的另一个好处是,你可以轻松地将Unity Cloud Build与你的项目集成。Unity Cloud Build是一项免费服务,可监控你的Bitbucket仓库中的更改,在推送新更改时自动为你的目标平台创建游戏版本,并通过电子邮件发送下载你的打包游戏的链接。
UnityCloud Build支持所有流行的桌面和移动游戏平台。
这使得与非技术用户共享新版本的游戏真的很容易,因为他们不再需要从服务器拉回和构建更改本身。此外,如果你正在为移动设备制作游戏,你可以直接从Unity Cloud Build安装它们,而不是将APK上传到自己的云存储或使用Xcode。
要使用Unity Cloud Build和Bitbucket,请遵循Unity3d.com官方教程:你的第一个云项目。
或者如果你感觉冒险,直接进入,并为你的项目启用Unity云构建,这是很直接。在设置你的第一个构建目标的时候,你只需输入你的Bitbucket存储库的URL地址(例如https://bitbucket.org/tpettersen/spaceshooter)作为服务器URL地址,然后根据提示将生成的Unity Cloud Build SSH**复制并粘贴到你的Bitbucket帐户。如果你计划使用Git LFS,则需要将生成的**添加为通用SSH**,因为部署**尚不支持Git LFS。否则,对于vanilla Git,你可以将其添加为特定于你的游戏仓库的部署**。
我希望你已经找到本指南,并对于开始使用Git和Unity有用。如果你有任何关于Git和Unity的问题或意见,在Twitter上给我一条线,我是@kannonboy。
非常感谢Git LFS贡献者Steve Streeting和Unity 传教者John Sietsma帮助准备这篇文章!