Mercurial與TortoiseHg使用入門教程

分佈式版本管理工具當中,Git和Mercurial(意思爲水銀的,於是經常縮寫爲Hg)是最爲流行的工具。大名鼎鼎的Linux就用Git作源碼管理,而Python和Firefox則採用Hg(你可以在這找到一堆使用Hg的項目 )。

1.爲何要用 分佈式配置管理

2.爲何選擇Mercurial

因爲Git的優勢主要在於分支,而漢化並不需要太多分支;而Git對Windows的支持似乎不如 Mercurial,ssh也比http麻煩,比較難教漢化組成員們使用;此外還有個特別的原因:Hg主要是用Python實現的(小部分使用C實現)。
Hg也有個很嚴重的缺點:不支持針對單個文件夾的分支。如果劇本翻譯和改圖要建立分支都必須複製整個倉庫,而對翻譯來說,圖像文件並不是他需要的部分。
附:Google還發了篇《Analysis of Git and Mercurial》 ,說明爲什麼Google Code決定支持Hg,而不支持Git。
Git的優勢:

  • 客戶端存儲控制。可以刪除任意的版本,而無需考慮該分支的後續版本,而Hg做不到。
  • 無限的父結點數。Hg一次只能分成2個分支,合併N個分支要進行很多次操作。而Git沒有限制。
  • 支持rebase。它可以將當前版本移到最新的分支去。例如假設有個本地庫在開發1.0的新特性,而基線已經升級到1.1了;一般情況下是需要合併到1.1去的,而rebase可以避免這種操作。

Hg的優勢:

  • 學習曲線。由於很多因素,Git比Hg的學習曲線更陡峭。
  • 支持Windows。
  • 維護。Git需要定期維護。
  • 歷史是不可侵犯的。Git很強大,可以幹幾乎任何事,因此也會丟失歷史信息。

看起來Git在技術上是要強於Hg的,不過由於文件操作的實現依賴於操作系統,移植到Bigtable會存在麻煩;而且Hg有很好的基於HTTP的無狀態pushing和pulling,容易與Google的構架整合(Google幾乎所有的服務都基於HTTP)。
對於這點,Google還特意提供了測試數據,指出在使用HTTP時,Git比Hg慢1個數量級。(提到了2個數字,分別慢22倍和12倍。)

3.哪裏可以免費託管代碼:

  • GitHub :這個網站非常出名,是用RoR建的,300MB的免費空間,支持Git,但不支持Hg(雖然有插件,但教別人用太麻煩),而且沒有私有庫。
  • bitbucket :這個是用Django建的,可以建1個私有庫,150MB的免費空間,支持Hg。
  • ProjectLocker :只有(無限個)私有庫,500MB的免費空間,支持SVN和Git,但只能有5個用戶。閉源項目推薦,但顯然不適合龐大的tomo漢化組。
  • Unfuddle :200MB的免費空間,支持SVN和Git,只能有1個庫和2個用戶。

最終我選擇了最小的bitbucket,因爲也差不多夠用了。
(注:Google Code現已支持Hg,但只能託管源碼,不能用於其他目的,所以我只能放棄。但如果你是開源軟件開發,那麼Google Code是最大方的,還可以發信申請擴大配額,只是偶爾會被GFW。)

4. TortoiseHg 的安裝

接着就開始裝軟件了。習慣了SVN的烏龜,所以仍然選擇了烏龜汞(TortoiseHg )。
目前這個版本支持Windows XP、Vista和Windows 7,所以不擔心兼容性。
安裝很簡單,裝好後要重啓(其實不重啓也可以用)。
喜歡命令行的還可以在CMD裏輸入hg試試。
5.讓 TortoiseHg 界面顯示中文

需要建一個“LANGUAGE”環境變量(在系統屬性裏),值爲“zh_CN”。
決定採用Mercurial(Hg)了 - keakon的blog -
接着還得去這個文件夾:C:/Program Files/TortoiseHg/cmenu_i18n,導入thg-cmenu-zh_CN.reg文件。
修改之後,軟件界面和命令行(hg和hgtk)就已經是中文了,但右鍵菜單還是英文,重啓或註銷即可變成中文。

6.Mercurial基本操作

在使用前,建議看看《Mercurial 使用教程》 ,瞭解下幾個術語。
Init 是指初始化,也就是創建一個空的倉庫。
Clone 是指創建倉庫的複本,創建的來源可以是一個http或ssh鏈接表示的倉庫,也可以是本地倉庫。
Commit 是 指提交,即接受所有的改動,將當前版本作爲最新版本(也叫tip)。注意這個提交和集中式SCM不同,它只提交的本地倉庫,而且本地倉庫會 詳細記錄所有的變動(稱爲變更集或改動集)。因此不用客氣,多提交幾次也沒關係,因爲不影響別人的倉庫。而如果怕影響自己的話,可以clone一個複本, 再對複本進行改寫和提交。
Revert 是指恢復,即撤銷所有的改動,恢復到未更改的狀態。右鍵菜單裏你是找不到它的,原因後面再提。
Pull的意思是拉,是將其他倉庫有,而當前倉庫沒有的變更集“下載”到當前倉庫。不過這只是添加了變更集,文件並不會改動。(變更集有一個唯一的hash標識,所以很容易區分。)
Update 的意思就是更新,當獲取了其他變更集,且需要更改以保持和其他倉庫一致時,就可以執行它了。
Push 的意思是推,就是將當前倉庫的變更集“上傳”到其他倉庫去。其他倉庫必須支持該操作,並可能需要經過驗證。如果是從本地倉庫A push到本地倉庫B,就相當於用B pull A。此外,push也不會更新倉庫的版本,因爲它是共享的,需要的人直接選擇想要的版本即可。
Merge 就是指合併。當一個文件同時被多次修改,並存放在多個倉庫時,要獲得一個統一的版本,就需要合併。對於翻譯而言,一個文本可能同時會分給多個人,於是合併時只需要接受每個人的改動即可。

如果你還想了解更多,可以讀讀《Mercurial: The Definitive Guide》
這些術語介紹完後,就可以看看別人寫的使用方法了:
Git Vs Mercurial hg? 異地協同開發,分佈式SCM方案選擇!
CodeBeamer+Mercurial實務操作手冊
當然,那個PDF文檔也是很有用的資料。
不過爲了漢化組的同志們,我還是截圖說明如何進行完整的操作吧。
首先去我的bitbucket主頁 ,找到FamilyProject 這個項目。
下面會有一些提示:

引用:
Clone this repository (size: 4.3 MB): HTTPS / SSH
$ hg clone https://[email protected]/keakon/familyproject/

接着在你的硬盤任何位置新建一個文件夾,起名爲FamilyProject。
進入這個文件夾,右鍵點擊空白處,在TortoiseHg菜單裏選“克隆”。
決定採用Mercurial(Hg)了 - keakon的blog -
在源路徑處填入剛纔看到的地址:https://[email protected]/keakon/familyproject/ ,再點“克隆”按鈕,等待下載完成即可。
決定採用Mercurial(Hg)了 - keakon的blog -
下載完成後,你便擁有完整的項目文件了,可以對其進行更改等操作。
接下來進行一個克隆操作,將它複製到另一個本地倉庫。方法很簡單,和之前的克隆一樣,不過源路徑填剛纔生成的文件夾,目標路徑填新文件夾:
決定採用Mercurial(Hg)了 - keakon的blog -
這次操作應該1、2秒就完成了,因爲是本地複製。
接着用文本編輯器打開FamilyProject裏的一個文件,例如SNR02.ISF。
會發現第1句是:●0001● ロードに失敗しました。
把它改成:讀取失敗。
然後右鍵點FamilyProject文件夾,選擇“HG 提交”。
決定採用Mercurial(Hg)了 - keakon的blog -
這時會列出改動的文件和具體的差異。填寫一下描述,再點提交按鈕。
決定採用Mercurial(Hg)了 - keakon的blog -
再打開FamilyProject-new裏的同名文件,找到第2句:●0002● 終了します。
把它改成:讀取失敗。
然後也進行同樣的提交操作。
現在你在2個倉庫裏就有2個不同的分支,於是看看如何合併它。
先右鍵點FamilyProject文件夾,選擇“HG 倉庫瀏覽器”。
決定採用Mercurial(Hg)了 - keakon的blog -
然後在地址欄裏填上新倉庫的地址,點“拉取改動集”按鈕:
決定採用Mercurial(Hg)了 - keakon的blog -
這時你會發現,最新的tip版變成了FamilyProject-new裏的版本了,而且多了一個分支。
但是打開文件來看,仍然沒變。此時我們可以右鍵點最上面的改動集,選擇“更新”操作(上一步也可以選擇“拉取後更新”來自動完成),來切換版本。
決定採用Mercurial(Hg)了 - keakon的blog -
注意版本已經列出來了,有改動集編號、改動集hash標識、描述、是否爲default和tip版本等幾種提示,所以應該不會弄錯。
決定採用Mercurial(Hg)了 - keakon的blog -
確認無誤後就可以點“更新”按鈕了,這時你會發現你的文件變成FamilyProject-new裏的版本了,但自己的改動卻丟失了(別緊張,文件沒丟失)。
原因很簡單,更新只是切換改動集版本而已,並不會進行合併。如果要換回自己的版本,右鍵點下面那個改動集,選“更新”就行了。
但是我的目的是合併,而非更新,所以下面繼續說明合併。
操作很簡單,右鍵點第2個分支,選擇“合併”操作。
決定採用Mercurial(Hg)了 - keakon的blog -
點擊“合併”按鈕。
決定採用Mercurial(Hg)了 - keakon的blog -
由於改動的地方都不一樣,所以並不衝突,於是順利合併成功了。接着點“提交”按鈕。
決定採用Mercurial(Hg)了 - keakon的blog -
這時就列出改動的地方了,-號表示刪除,+表示新增。可以看到2處改動都正確判斷了,因此不需要我們做其他的事,直接點“提交”按鈕即可。
決定採用Mercurial(Hg)了 - keakon的blog -
再看看改動集,分支已經合併了,而你的文件也成功更新了。
決定採用Mercurial(Hg)了 - keakon的blog -
不過FamilyProject-new裏的文件還是舊版本。
如果你不需要了,直接刪除這個文件夾就行了;如果還想繼續使用的話,也打開它的“HG 倉庫瀏覽器”,選擇“拉取後更新”,再點“拉取改動集”按鈕:
決定採用Mercurial(Hg)了 - keakon的blog -
操作完後,2個倉庫就完全一樣了,你就可以繼續其他操作了。
如果你改完了,需要傳給別人,則需要push給別人,或叫別人來pull,這個操作實際上和本地倉庫的操作是差不多的。
最簡單的方法就是發佈到本地的Web服務器。
右鍵點文件夾,選擇“TortoiseHg - Web服務器”:
決定採用Mercurial(Hg)了 - keakon的blog -
出現了一個窗口(順帶一提,這個玩意很容易就能看出是Python寫的),不過先彆着急,還得點“配置”按鈕設置一下:
決定採用Mercurial(Hg)了 - keakon的blog -
把“SSL加密推送”設爲“False”,因爲你沒有SSL證書。在“允許推送”處填允許的用戶名,爲了省事,填個“*”就允許所有人推送了。下面的編碼也得改成和文件編碼一致,免得在線查看文件時亂碼。
決定採用Mercurial(Hg)了 - keakon的blog -
確定後返回,在端口處填一個小於65535的數,默認爲8000,然後點“啓動”按鈕。
決定採用Mercurial(Hg)了 - keakon的blog -
啓動好後,就可以通過瀏覽器來訪問了,地址爲:http://你的IP:端口號/。
決定採用Mercurial(Hg)了 - keakon的blog -
接下來就試試推送吧。
打開FamilyProject-new的文件夾,更改一下文件,然後提交。
這次我就不用倉庫瀏覽器了,因爲它太龐大了,而改用小巧的“同步”操作:
決定採用Mercurial(Hg)了 - keakon的blog -
填入剛纔你用瀏覽器訪問的地址,然後點“推送”按鈕,推送就完成了。
決定採用Mercurial(Hg)了 - keakon的blog -
接着你就可以去FamilyProject文件夾查看改動集了,需要的話可以按前面所說的進行更新和合並操作。
不過這個IP地址有可能是外部不能訪問的,也許是網關或防火牆的設置導致的,這樣你的Web服務器就不能被其他人訪問了。
一個臨時的解決辦法就是郵寄。不過在這之前,你還得改下郵件設置。
於是右鍵點文件夾,選擇“TortoiseHg - 全局設置”:
決定採用Mercurial(Hg)了 - keakon的blog -
在“郵件”裏填上你的郵箱信息:
決定採用Mercurial(Hg)了 - keakon的blog -
這裏有Gmail的配置說明 ,其他的照着填就行了。
注意密碼是郵箱的登錄密碼。如果你填了,會以明文的形式保存起來,所以如果你的電腦還有別人用,就不要填,不過發送郵件時就需要手動輸入密碼了。
配置完後回到同步窗口,點“郵寄”按鈕,然後填寫郵件內容。注意把“附件”勾上,然後點擊發送。
決定採用Mercurial(Hg)了 - keakon的blog -
不過網絡不好時很可能失敗,成功後對方會收到一封郵件,包含一個.patch類型的附件。
但是TortoiseHg並不支持導入這個patch文件,只能通過命令行來執行。
於是接受者可以運行CMD,切換到需要導入的倉庫,然後執行這行命令:

引用:
hg import patch文件名

當然,命令行對某些人來說是很恐怖的,於是再換個方法:去bitbucket建立自己的倉庫。
註冊我就不說了,可以新註冊一個賬號,也可以使用OpenID。
登錄以後然後到FamilyProject項目去,點擊那個fork 鏈接。
決定採用Mercurial(Hg)了 - keakon的blog -
Fork的意思是以我的倉庫爲藍本,創建一個複本。和clone差不多,只不過是在遠程進行的。
在新頁面填寫項目的名字,然後點擊“Advanced settings”,進行更多的設定,最後點“Create fork”按鈕來創建。
決定採用Mercurial(Hg)了 - keakon的blog -
和你在本地clone一樣,遠程的fork也是幾秒鐘就完成了,並自動重定向到了這個倉庫。(結果發現這個倉庫居然小了一半,看來空間佔用是很詭異的。)
決定採用Mercurial(Hg)了 - keakon的blog -
接下來你就可以對這個倉庫進行操作了,方法和自建的Web服務器一樣。
當改動完時,需要通知別人時,再次來到FamilyProject項目,點擊那個“pull request”按鈕。
在新的頁面裏填寫郵件內容,附上你的倉庫地址;再把需要通知的人勾選上;最後點“Send request”按鈕發送即可。
收到郵件的人就可以去你的倉庫進行pull操作來獲取更新了。
之後的合併等操作前面也說過了,也就不重提了。
如果空間不夠用了,再創建一個賬號是最方便的方法。
當然也可以去“Admin”標籤,點右下角的“Delete repository”按鈕,這樣就能刪除不要的倉庫的。
此外,這裏還有個“Repository management”鏈接,進去後可以執行strip操作,刪除不需要的版本。
不過刪除後好像沒增加空間,鬱悶了…於是發信給客服,整了半天還沒搞定,我們通信的頻率大概是2小時一次…

原帖:http://www.cnblogs.com/meetrice/archive/2010/07/12/1775707.html

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