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目录下的文件(如纹理和音频),并使用免费的BitbucketUnity 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识别的格式写入磁盘:

Unity中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仓库中的更改,在推送新更改时自动为你的目标平台创建游戏版本,并通过电子邮件发送下载你的打包游戏的链接。

Unity中Git使用指南

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帮助准备这篇文章!