Unity3D的版本控制
本文旨在介绍如何对你的Unity工程进行正确版本控制!
版本控制,是开发者最重要的工具之一。借助它,可以轻松回到之前一个时间点保存的版本,比较新老版本代码查看更改处,团队合作的时候也保证大家使用的是相同代码,不会出现意外覆盖彼此成果的情况。Unity 3.5之前,只有Unity Pro工程才支持版本控制;Unity 3.5之后,免费版也得以支持。
何为版本控制?
版本控制系统[version control system],即VCS,对文件夹中文件的更改进行记录,也称为“工作副本”[working copy]。这些更改存储在数据库中的版本库[repository]文件夹里。每当你在工作副本中做出更改,你就需要将这些修改提交到版本库。然后,VCS会将其与版本库中已存在的数据进行对比,并只存储更改处,以保证版本库尽可能小。
本工程中,我们使用Mercurial分布式VCS。集中式VCS系统如Subversion(SVN),通常依赖于存储在服务器上的远程版本库;而分布式VCS可直接在电脑上映射本地版本库,也称“local branches”。这意味着你可以独立修改并提交至local branches,测试甚至删除,在完善之前不必通知团队其他成员做出修订。而一旦最终版本确定,你将所做的修改“push”到远程版本库,而团队其他成员将其“pull”到自己的local branches。
为版本控制准备一个Unity工程
Unity工程需要特定元信息[meta information],用以记录各种资源[asset]所关联的组件和设置。一般来说,元数据信息是以一系列二进制文件的形式存储在Unity工程的库[Library]文件夹下。但是,这种二进制文件无法合并,因而即使两个人编辑的是不同资源,所做的更改也就会覆盖彼此而导致编辑器出现错误。
这个问题的解决方案是:
点击 Edit > Project Settings > Editor
在Version Control标题栏下,将Mode改为Meta Files
单击File > Save
这样设置之后,Unity就会在工程的资源[Assets]文件夹下创建元数据文件。这样一来,在编辑器中修改资源就只有资源本身以及它相关联的元文件才会通知修改,而非整个库文件夹。
安装Mercurial
Windows和OSX有不同的Mercurial安装包。访问Mercurial网站单击这个下载按钮。网站会自动识别你所使用的操作系统,并下载相应的安装程序。
解压缩安装包并运行,一直单击直至完成,安装过程不需要任何干预。
打开命令行来确保Mercurial安装正确。Windows系统,选中开始,在搜索框中输入cmd。OSX系统,打开Spotlight并搜索terminal。
在命令行中,输入:
hg .
复制代码
此时应该会出现一个简短的信息列表,包括正在使用的Mercurial版本还有常用命令。要想得到完整的命令列表,请输入:
hg help
复制代码
若要获得特定命令的帮助信息,只需在help后面输入命令的名称:
hg help clone
复制代码
注: Mercurial命令总是以hg开头,元素周期表上汞的缩写,名字简单好记并且输入方便。[十按,Mercurial这个单词的中文意思就是水银,水银就是汞]
初始化版本库
首先,我们需要给项目文件夹分配版本库。
在命令行中输入:
hg init
复制代码
好的,现在我们的文件夹就有了版本库,并已准备好进行版本控制。若你开启隐藏文件选项,你会发现项目文件夹中创建了一个.hg文件夹,这就是版本库所在。如果出于某种原因要删除版本控制,只需将.hg文件夹删除,工作副本仍可使用。
检查状态
现在,我们的项目文件夹中有了版本库,让我们对版本库状态进行检查,看看有什么变化。Mercurial也接受缩写命令,所以以下命令均有效:
hg status
hg stat
hg st
复制代码
状态报告会以文件列表的形式出现,每个文件旁边会对应一个字符。当前情况下,所有的文件旁边都会有一个问号。问号表示该文件之前在版本控制的版本库中不存在。
? 该文件在工作副本中,但在版本库中没有记录。
! 该文件在版本库中有记录,但在工作副本中遗失。
A 该文件在上次提交的时候就已经加到版本库中。
M 该文件在上次提交的时候做出修改 。
R 该文件在下次提交时将从版本库中删除。
将文件添加到版本库
我们需要将文件明确地添加版本库,以保证得到Mercurial版本控制。
添加单个文件:
hg add myfile.txt
复制代码
添加整个文件夹:
hg add scripts/
复制代码
一次性添加所有未处于版本控制(状态报告中带有问号标记)的文件,可以简单的不提及任何文件名:
hg add
复制代码
执行状态检查。
hg status
复制代码
现在所有被添加的文件旁边应该都有一个A,这表示它们已被成功添加到版本库中,为Mercurial所记录。
提交更改
Mercurial已经明确了需要进行版本控制的文件,现在我们需要将它们提交到版本库。每一次的提交都是一次修订,记录了先前版本与当前版本之间的差异。
每次的提交都包含两部分内容,信息[message]以及用户名[username]。信息指的是你对修改的描述,保持简洁;用户名仅仅是一个标识符,让其他使用版本库的人知道这些修改的作者是谁。用户名以-u标志,信息以-m标志:
hg commit -u ian -m "initial"
复制代码
为确认提交成功,我们需要检查日志:
hg log
复制代码
二次确认,进行状态检测以保证没有遗漏任何修改。
hg status
复制代码
空白的状态报告表示一切提交成功。
注:建议每次提交的修改都应该尽可能小,这样描述信息就会尽可能简洁,如“增加玩家跳跃高度”。若描述信息用到了“并”或逗号分隔,那么可以分成两次提交了。这样做的原因是,当你遇到问题时能够很容易的回滚到某次更改。
修正错误
修正错误的主要方法有两个:回滚或恢复。回滚将撤消最后输入的命令,尤其适用于修正提交信息中的拼写错误。
hg rollback
复制代码
执行状态检查,确保一切都得到正确回滚。
hg status
复制代码
恢复功能更加强大,能够让你恢复到多次修改前的版本。查找要恢复的版本,可以检查修订版本的日志:
hg log
复制代码
选择要恢复的修订版本可通过编号和哈希值指定。版本库中的编号是特定的,别人做出的修改版本会有不同的编号。而哈希值是公用的,这意味着任何人都可以通过哈希值恢复到共享版本库中某个特定版本。
要恢复到某个特定的版本,我们需要使用-r标志来指定版本号。我们还需要-a标记来告诉Mercurial“恢复所有”。最后,我们用-no-backup标记来告诉Mercurial不需要创建备份文件。
hg revert -r 0 -a --no-backup
复制代码
执行状态检查,以确保一切恢复正常。
hg status
复制代码
注:如果省略–no-backup标志,Mercurial会为所有恢复文件创建备份。这些备份将带有.orig扩展名。确保不增加.orig 文件。
忽略不需要的文件
现在,我们已经撤消错误,接下来要确保它不会再次发生。我们要永久忽略与错误相关的库和临时文件夹,以后就不会再被意外触发。
Mercurial使用.hgignore的特殊文件来存储你想要永久忽略的文件和文件夹名称。这个文件就在你的项目文件夹中,与其他文件一样接受版本控制,确保其不会被意外修改。
使用任意文本编辑器输入以下内容:
syntax: glob
Library
Temp
*.pidb
*.sln
*.userprefs
*.csprog
*.orig
复制代码
这告诉Mercurial,我们使用shell-style语法(也叫“glob”语法),忽略Library和Temp文件夹,忽略MonoDevelop创建一些临时文件,忽略意外状况下创建的.orig文件。
将文件以.hgignore(注意在开始的点)命名,保存于项目文件夹的根目录。然后再执行状态检查:
hg status
复制代码
现在,.hgignore文件应该会出现在状态报告中,而Library文件夹,Temp文件夹以及其他被忽略的文件就不会出现了。这样一来,我们就可以放心使用add命令而无需确切文件名,然后提交结果。
hg add
hg commit -u ian -m "Initial"
复制代码
检查日志以确保提交成功。
hg log
复制代码
注:在这里可以找到更多hgignore文件的相关信息。
将修改push到远程版本库
如果你想与其他开发人员共享版本库,最简单的方法就是在服务器上创建一个远程版本库并将修改push上去。
首先,你需要找到Mercurial主机。市面上存在的如BitBucket还有Kiln,都有免费账户,适合小团队。我们使用的是BitBucket,但二者服务本质上是相同的。你一旦注册完任一方的帐户,就务必使用他们的网络界面新建一个版本库。
一旦创建完毕,找到“clone path”如下:
hg clone https://bitbucket.org/username/reponame
通常情况下,这个命令用于创建版本库的本地副本。但我们已经有版本库了,取而代之我们需要讲修改上传到远程版本库。截取clone字段结尾的URL地址,将它用作push命令的目标地址。
hg push https://bitbucket.org/username/reponame
复制代码
Mercurial会将本地版本库与远程版本库的内容作比较,找出不同点,将新的修改发送到远程版本库中。
然而,它会提示输入用户名和密码,这些必须对应注册主机服务时的用户名/电子邮件和密码。
Mercurial会报告说所有的更改push成功,这意味着所有有版本库访问权限的人都可以pull到修订版本。首先,得创建版本库的本地副本。
hg clone https://bitbucket.org/username/reponame
复制代码
然后,在别人做出修改的时候pull其他人的修改:
hg pull
复制代码
而你自己做出修改时“update”,以确保更新你的工作副本:
hg update
复制代码
但为了节省时间,你可以事宜-u标记一次性pull并update:
hg pull -u
复制代码
注:Mercurial会在二进制文件更新或合并时会出现提示框,请总是选择(O)other选项,而非(L)ocal,除非你修改的是本地二进制文件。
设置,让生活更轻松
重复相同的命令的时候是很单调的,如提交时一遍又一遍输入用户名,一遍又一遍输入密码等等。然而,其实这些都可以设置,存储在hgrc文件。首先创建一个hgrc文件,使用任意文本编辑器,输入以下内容:
[paths]
default = https://bitbucket.org/username/reponame
复制代码
其告诉Mercurial在执行pull,push命令时的缺省路径,记得要将这个虚拟地址替换成你的远程版本库的真实地址。接着,输入以下内容:
[ui]
username = Firstname Lastname
复制代码
这告诉Mercurial在提交时要使用的缺省用户名。再次提醒,要记得将其替换正确并且确保邮箱地址与注册的相符。最后,输入:
[auth]
host.prefix = bitbucket.org
host.username = username
host.password = password
host.schemes = http https
复制代码
这告诉Mercurial在push到安全的远程版本库时要用的证书,这样你就不必每次都输入用户名和密码。务必将前缀更换为您的主机地址的最短部分,前缀不能包含http://协议。接着,讲用户名和密码替换为你为自己的主机签署的用户名和密码,其会告诉Mercurial要关联的协议。
最后,将文件保存在版本库的.hg文件夹下,命名为hgrc。以后,你就不再需要手动输入用户名,密码或路径了。
小结
在新手看起来,版本控制可能有点令人望而生畏,但它绝对不是无用功。它为你提供心灵上的安宁,让你能够回滚至项目存在记录的任何时间点。使用远程版本库不仅可以与团队成员共享代码,在重大错误发生的时候(如硬盘驱动器故障)还能够轻易恢复项目。
欲了解更多分布式版本控制和Mercurial的相关内容,请参阅Hg初始化,一系列的深入讲解版本控制以及Mercurial功能的文章。其短小精悍,非常翔实,易于阅读理解,而且有趣。