Unity3D的版本控制(Unity 3D +Mercurial)

本文旨在介紹如何對你的Unity工程進行正確版本控制!

版本控制,是開發者最重要的工具之一。藉助它,可以輕鬆回到之前一個時間點保存的版本,比較新老版本代碼查看更改處,團隊合作的時候也保證大家使用的是相同代碼,不會出現意外覆蓋彼此成果的情況。Unity 3.5之前,只有Unity Pro工程才支持版本控制;Unity 3.5之後,免費版也得以支持。

何爲版本控制?
版本控制系統[version control system],即VCS,對文件夾中文件的更改進行記錄,也稱爲“工作副本”[working copy]。這些更改存儲在數據庫中的版本庫[repository]文件夾裏。每當你在工作副本中做出更改,你就需要將這些修改提交到版本庫。然後,VCS會將其與版本庫中已存在的數據進行對比,並只存儲更改處,以保證版本庫儘可能小。
local_repo.png 
本工程中,我們使用Mercurial分佈式VCS。集中式VCS系統如Subversion(SVN),通常依賴於存儲在服務器上的遠程版本庫;而分佈式VCS可直接在電腦上映射本地版本庫,也稱“local branches”。這意味着你可以獨立修改並提交至local branches,測試甚至刪除,在完善之前不必通知團隊其他成員做出修訂。而一旦最終版本確定,你將所做的修改“push”到遠程版本庫,而團隊其他成員將其“pull”到自己的local branches。
2.png 
爲版本控制準備一個Unity工程
Unity工程需要特定元信息[meta information],用以記錄各種資源[asset]所關聯的組件和設置。一般來說,元數據信息是以一系列二進制文件的形式存儲在Unity工程的庫[Library]文件夾下。但是,這種二進制文件無法合併,因而即使兩個人編輯的是不同資源,所做的更改也就會覆蓋彼此而導致編輯器出現錯誤。

這個問題的解決方案是:
  • 點擊 Edit > Project Settings > Editor
  • Version Control標題欄下,將Mode改爲Meta Files
  • 單擊File > Save

3.png 
這樣設置之後,Unity就會在工程的資源[Assets]文件夾下創建元數據文件。這樣一來,在編輯器中修改資源就只有資源本身以及它相關聯的元文件纔會通知修改,而非整個庫文件夾。
4.png 
安裝Mercurial
Windows和OSX有不同的Mercurial安裝包。訪問Mercurial網站單擊這個下載按鈕。網站會自動識別你所使用的操作系統,並下載相應的安裝程序。
5.png 
解壓縮安裝包並運行,一直單擊直至完成,安裝過程不需要任何干預。
QQ截圖20120923214339.png 
打開命令行來確保Mercurial安裝正確。Windows系統,選中開始,在搜索框中輸入cmd。OSX系統,打開Spotlight並搜索terminal
commandline.png 
在命令行中,輸入:
  1. hg .
複製代碼
此時應該會出現一個簡短的信息列表,包括正在使用的Mercurial版本還有常用命令。要想得到完整的命令列表,請輸入:
  1. hg help
複製代碼
若要獲得特定命令的幫助信息,只需在help後面輸入命令的名稱:
  1. hg help clone
複製代碼
注: Mercurial命令總是以hg開頭,元素週期表上汞的縮寫,名字簡單好記並且輸入方便。[十按,Mercurial這個單詞的中文意思就是水銀,水銀就是汞]

初始化版本庫
首先,我們需要給項目文件夾分配版本庫。
在命令行中輸入:
  1. hg init
複製代碼
好的,現在我們的文件夾就有了版本庫,並已準備好進行版本控制。若你開啓隱藏文件選項,你會發現項目文件夾中創建了一個.hg文件夾,這就是版本庫所在。如果出於某種原因要刪除版本控制,只需將.hg文件夾刪除,工作副本仍可使用。
hg_folder.png 
檢查狀態
現在,我們的項目文件夾中有了版本庫,讓我們對版本庫狀態進行檢查,看看有什麼變化。Mercurial也接受縮寫命令,所以以下命令均有效:
  1. hg status
  2. hg stat
  3. hg st
複製代碼
狀態報告會以文件列表的形式出現,每個文件旁邊會對應一個字符。當前情況下,所有的文件旁邊都會有一個問號。問號表示該文件之前在版本控制的版本庫中不存在。
? 該文件在工作副本中,但在版本庫中沒有記錄。  
           ! 該文件在版本庫中有記錄,但在工作副本中遺失。  

A  
該文件在上次提交的時候就已經加到版本庫中。  
        M          該文件在上次提交的時候做出修改  。
R          該文件在下次提交時將從版本庫中刪除。  


將文件添加到版本庫
我們需要將文件明確地添加版本庫,以保證得到Mercurial版本控制。
添加單個文件:
  1. hg add myfile.txt
複製代碼
添加整個文件夾:
  1. hg add scripts/
複製代碼
一次性添加所有未處於版本控制(狀態報告中帶有問號標記)的文件,可以簡單的不提及任何文件名:
  1. hg add
複製代碼
執行狀態檢查。
  1. hg status
複製代碼
現在所有被添加的文件旁邊應該都有一個A,這表示它們已被成功添加到版本庫中,爲Mercurial所記錄。

提交更改
Mercurial已經明確了需要進行版本控制的文件,現在我們需要將它們提交到版本庫。每一次的提交都是一次修訂,記錄了先前版本與當前版本之間的差異。

每次的提交都包含兩部分內容,信息[message]以及用戶名[username]。信息指的是你對修改的描述,保持簡潔;用戶名僅僅是一個標識符,讓其他使用版本庫的人知道這些修改的作者是誰。用戶名以-u標誌,信息以-m標誌:
  1. hg commit -u ian -m "initial"
複製代碼
爲確認提交成功,我們需要檢查日誌:
  1. hg log
複製代碼
二次確認,進行狀態檢測以保證沒有遺漏任何修改。
  1. hg status
複製代碼
空白的狀態報告表示一切提交成功。

注:建議每次提交的修改都應該儘可能小,這樣描述信息就會盡可能簡潔,如“增加玩家跳躍高度”。若描述信息用到了“並”或逗號分隔,那麼可以分成兩次提交了。這樣做的原因是,當你遇到問題時能夠很容易的回滾到某次更改。

修正錯誤
修正錯誤的主要方法有兩個:回滾或恢復。回滾將撤消最後輸入的命令,尤其適用於修正提交信息中的拼寫錯誤。
  1. hg rollback
複製代碼
執行狀態檢查,確保一切都得到正確回滾。
  1. hg status
複製代碼
恢復功能更加強大,能夠讓你恢復到多次修改前的版本。查找要恢復的版本,可以檢查修訂版本的日誌:
  1. hg log
複製代碼
8.png 
選擇要恢復的修訂版本可通過編號和哈希值指定。版本庫中的編號是特定的,別人做出的修改版本會有不同的編號。而哈希值是公用的,這意味着任何人都可以通過哈希值恢復到共享版本庫中某個特定版本。

要恢復到某個特定的版本,我們需要使用-r標誌來指定版本號。我們還需要-a標記來告訴Mercurial“恢復所有”。最後,我們用-no-backup標記來告訴Mercurial不需要創建備份文件。
  1. hg revert -r 0 -a --no-backup
複製代碼
執行狀態檢查,以確保一切恢復正常。
  1. hg status
複製代碼
:如果省略–no-backup標誌,Mercurial會爲所有恢復文件創建備份。這些備份將帶有.orig擴展名。確保不增加.orig 文件。

忽略不需要的文件
現在,我們已經撤消錯誤,接下來要確保它不會再次發生。我們要永久忽略與錯誤相關的庫和臨時文件夾,以後就不會再被意外觸發。

Mercurial使用.hgignore的特殊文件來存儲你想要永久忽略的文件和文件夾名稱。這個文件就在你的項目文件夾中,與其他文件一樣接受版本控制,確保其不會被意外修改。

使用任意文本編輯器輸入以下內容:
  1. syntax: glob
  2. Library
  3. Temp
  4. *.pidb
  5. *.sln
  6. *.userprefs
  7. *.csprog
  8. *.orig
複製代碼
這告訴Mercurial,我們使用shell-style語法(也叫“glob”語法),忽略Library和Temp文件夾,忽略MonoDevelop創建一些臨時文件,忽略意外狀況下創建的.orig文件。

將文件以.hgignore(注意在開始的點)命名,保存於項目文件夾的根目錄。然後再執行狀態檢查:
  1. hg status
複製代碼
現在,.hgignore文件應該會出現在狀態報告中,而Library文件夾,Temp文件夾以及其他被忽略的文件就不會出現了。這樣一來,我們就可以放心使用add命令而無需確切文件名,然後提交結果。
  1. hg add
  2. hg commit -u ian -m "Initial"
複製代碼
檢查日誌以確保提交成功。
  1. hg log
複製代碼
注:這裏可以找到更多hgignore文件的相關信息。

將修改push到遠程版本庫
如果你想與其他開發人員共享版本庫,最簡單的方法就是在服務器上創建一個遠程版本庫並將修改push上去。

首先,你需要找到Mercurial主機。市面上存在的如BitBucket還有Kiln,都有免費賬戶,適合小團隊。我們使用的是BitBucket,但二者服務本質上是相同的。你一旦註冊完任一方的帳戶,就務必使用他們的網絡界面新建一個版本庫。
一旦創建完畢,找到“clone path”如下:
  1. hg clone https://bitbucket.org/username/reponame
複製代碼
通常情況下,這個命令用於創建版本庫的本地副本。但我們已經有版本庫了,取而代之我們需要講修改上傳到遠程版本庫。截取clone字段結尾的URL地址,將它用作push命令的目標地址。
  1. hg push https://bitbucket.org/username/reponame
複製代碼
Mercurial會將本地版本庫與遠程版本庫的內容作比較,找出不同點,將新的修改發送到遠程版本庫中。

然而,它會提示輸入用戶名和密碼,這些必須對應註冊主機服務時的用戶名/電子郵件和密碼。

Mercurial會報告說所有的更改push成功,這意味着所有有版本庫訪問權限的人都可以pull到修訂版本。首先,得創建版本庫的本地副本。
  1. hg clone https://bitbucket.org/username/reponame
複製代碼
然後,在別人做出修改的時候pull其他人的修改:
  1. hg pull
複製代碼
而你自己做出修改時“update”,以確保更新你的工作副本:
  1. hg update
複製代碼
但爲了節省時間,你可以事宜-u標記一次性pull並update:
  1. hg pull -u
複製代碼
注:Mercurial會在二進制文件更新或合併時會出現提示框,請總是選擇(O)other選項,而非(L)ocal,除非你修改的是本地二進制文件。

設置,讓生活更輕鬆
重複相同的命令的時候是很單調的,如提交時一遍又一遍輸入用戶名,一遍又一遍輸入密碼等等。然而,其實這些都可以設置,存儲在hgrc文件。首先創建一個hgrc文件,使用任意文本編輯器,輸入以下內容:
  1. [paths]
  2. default = https://bitbucket.org/username/reponame
複製代碼
其告訴Mercurial在執行pull,push命令時的缺省路徑,記得要將這個虛擬地址替換成你的遠程版本庫的真實地址。接着,輸入以下內容:
  1. [ui]
  2. username = Firstname Lastname
複製代碼
這告訴Mercurial在提交時要使用的缺省用戶名。再次提醒,要記得將其替換正確並且確保郵箱地址與註冊的相符。最後,輸入:
  1. [auth]
  2. host.prefix = bitbucket.org
  3. host.username = username
  4. host.password = password
  5. host.schemes = http https
複製代碼
這告訴Mercurial在push到安全的遠程版本庫時要用的證書,這樣你就不必每次都輸入用戶名和密碼。務必將前綴更換爲您的主機地址的最短部分,前綴不能包含http://協議。接着,講用戶名和密碼替換爲你爲自己的主機簽署的用戶名和密碼,其會告訴Mercurial要關聯的協議。

最後,將文件保存在版本庫的.hg文件夾下,命名爲hgrc。以後,你就不再需要手動輸入用戶名,密碼或路徑了。

小結
在新手看起來,版本控制可能有點令人望而生畏,但它絕對不是無用功。它爲你提供心靈上的安寧,讓你能夠回滾至項目存在記錄的任何時間點。使用遠程版本庫不僅可以與團隊成員共享代碼,在重大錯誤發生的時候(如硬盤驅動器故障)還能夠輕易恢復項目。
hginit.png 
欲瞭解更多分佈式版本控制和Mercurial的相關內容,請參閱Hg初始化,一系列的深入講解版本控制以及Mercurial功能的文章。其短小精悍,非常翔實,易於閱讀理解,而且有趣。

原文鏈接:http://mobile.tutsplus.com/tutorials/game-engine/using-version-control-with-unity3d/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章