Mercurial與TortoiseHg使用入門教程)

來源:互聯網
上載者:User
Mercurial與TortoiseHg使用入門教程文章來源:http://www.keakon.cn/bbs/thread-1865-1-1.html

分布式版本管理工具當中,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.哪裡可以免費Managed 程式碼:

  • 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”。

接著還得去這個檔案夾: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://keakon@bitbucket.org/keakon/familyproject/

接著在你的硬碟任何位置建立一個檔案夾,起名為FamilyProject。
進入這個檔案夾,右鍵點擊空白處,在TortoiseHg菜單裡選“複製”。

在源路徑處填入剛才看到的地址:https://keakon@bitbucket.org/keakon/familyproject/,再點“複製”按鈕,等待下載完成即可。

下載完成後,你便擁有完整的專案檔了,可以對其變更等操作。

接下來進行一個複製操作,將它複製到另一個本地倉庫。方法很簡單,和之前的複製一樣,不過源路徑填剛才產生的檔案夾,目標路徑填新檔案夾:

這次操作應該1、2秒就完成了,因為是本地複製。

接著用文字編輯器開啟FamilyProject裡的一個檔案,例如SNR02.ISF。
會發現第1句是:●0001● ロードに失敗しました。
把它改成:讀取失敗。
然後右鍵點FamilyProject檔案夾,選擇“HG 提交”。

這時會列出改動的檔案和具體的差異。填寫一下描述,再點提交按鈕。

再開啟FamilyProject-new裡的同名檔案,找到第2句:●0002● 終了します。
把它改成:讀取失敗。
然後也進行同樣的提交操作。

現在你在2個倉庫裡就有2個不同的分支,於是看看如何合并它。
先右鍵點FamilyProject檔案夾,選擇“HG 倉庫瀏覽器”。

然後在地址欄裡填上新倉庫的地址,點“拉取改動集”按鈕:

這時你會發現,最新的tip版變成了FamilyProject-new裡的版本了,而且多了一個分支。
但是開啟檔案來看,仍然沒變。此時我們可以右鍵點最上面的改動集,選擇“更新”操作(上一步也可以選擇“拉取後更新”來自動完成),來切換版本。

注意版本已經列出來了,有改動集編號、改動集hash標識、描述、是否為default和tip版本等幾種提示,所以應該不會弄錯。

確認無誤後就可以點“更新”按鈕了,這時你會發現你的檔案變成FamilyProject-new裡的版本了,但自己的改動卻丟失了(別緊張,檔案沒丟失)。
原因很簡單,更新只是切換改動集版本而已,並不會進行合并。如果要換回自己的版本,右鍵點下面那個改動集,選“更新”就行了。

但是我的目的是合并,而非更新,所以下面繼續說明合并。
操作很簡單,右鍵點第2個分支,選擇“合并”操作。

點擊“合并”按鈕。

由於改動的地方都不一樣,所以並不衝突,於是順利合并成功了。接著點“提交”按鈕。

這時就列出改動的地方了,-號表示刪除,+表示新增。可以看到2處改動都正確判斷了,因此不需要我們做其他的事,直接點“提交”按鈕即可。

再看看改動集,分支已經合并了,而你的檔案也成功更新了。

不過FamilyProject-new裡的檔案還是舊版本。
如果你不需要了,直接刪除這個檔案夾就行了;如果還想繼續使用的話,也開啟它的“HG 倉庫瀏覽器”,選擇“拉取後更新”,再點“拉取改動集”按鈕:

操作完後,2個倉庫就完全一樣了,你就可以繼續其他動作了。

如果你改完了,需要傳給別人,則需要push給別人,或叫別人來pull,這個操作實際上和本地倉庫的操作是差不多的。
最簡單的方法就是發布到本地的Web伺服器。
右鍵點檔案夾,選擇“TortoiseHg - Web伺服器”:

出現了一個視窗(順帶一提,這個玩意很容易就能看出是Python寫的),不過先別著急,還得點“配置”按鈕設定一下:

把“SSL加密推送”設為“False”,因為你沒有SSL認證。在“允許推送”處填允許的使用者名稱,為了省事,填個“*”就允許所有人推送了。下面的編碼也得改成和檔案編碼一致,免得線上查看檔案時亂碼。

確定後返回,在連接埠處填一個小於65535的數,預設為8000,然後點“啟動”按鈕。

啟動好後,就可以通過瀏覽器來訪問了,地址為:http://你的IP:連接埠號碼/。

接下來就試試推送吧。
開啟FamilyProject-new的檔案夾,更改一下檔案,然後提交。
這次我就不用倉庫瀏覽器了,因為它太龐大了,而改用小巧的“同步”操作:

填入剛才你用瀏覽器訪問的地址,然後點“推送”按鈕,推送就完成了。

接著你就可以去FamilyProject檔案夾查看改動集了,需要的話可以按前面所說的進行更新和合併作業。

不過這個IP地址有可能是外部不能訪問的,也許是網關或防火牆的設定導致的,這樣你的Web伺服器就不能被其他人訪問了。
一個臨時的解決辦法就是郵寄。不過在這之前,你還得改下郵件設定。
於是右鍵點檔案夾,選擇“TortoiseHg - 全域設定”:

在“郵件”裡填上你的郵箱資訊:

這裡有Gmail的配置說明,其他的照著填就行了。
注意密碼是郵箱的登入密碼。如果你填了,會以明文的形式儲存起來,所以如果你的電腦還有別人用,就不要填,不過發送郵件時就需要手動輸入密碼了。

配置完後回到同步視窗,點“郵寄”按鈕,然後填寫郵件內容。注意把“附件”勾上,然後點擊發送。

不過網路不好時很可能失敗,成功後對方會收到一封郵件,包含一個.patch類型的附件。
但是TortoiseHg並不支援匯入這個patch檔案,只能通過命令列來執行。
於是接受者可以運行CMD,切換到需要匯入的倉庫,然後執行這行命令:

引用:

hg import patch檔案名稱

當然,命令列對某些人來說是很恐怖的,於是再換個方法:去bitbucket建立自己的倉庫。
註冊我就不說了,可以新註冊一個帳號,也可以使用OpenID。
登入以後然後到FamilyProject項目去,點擊那個fork連結。

Fork的意思是以我的倉庫為藍本,建立一個複本。和clone差不多,只不過是在遠程進行的。
在新頁面填寫項目的名字,然後點擊“Advanced settings”,進行更多的設定,最後點“Create fork”按鈕來建立。

和你在本地clone一樣,遠端fork也是幾秒鐘就完成了,並自動重新導向到了這個倉庫。(結果發現這個倉庫居然小了一半,看來空間佔用是很詭異的。)

接下來你就可以對這個倉庫進行操作了,方法和自建的Web伺服器一樣。
當改動完時,需要通知別人時,再次來到FamilyProject項目,點擊那個“pull request”按鈕。
在新的頁面裡填寫郵件內容,附上你的倉庫地址;再把需要通知的人勾選上;最後點“Send request”按鈕發送即可。
收到郵件的人就可以去你的倉庫進行pull操作來擷取更新了。

之後的合并等操作前面也說過了,也就不重提了。
如果空間不夠用了,再建立一個帳號是最方便的方法。
當然也可以去“Admin”標籤,點右下角的“Delete repository”按鈕,這樣就能刪除不要的倉庫的。
此外,這裡還有個“Repository management”連結,進去後可以執行strip操作,刪除不需要的版本。
不過刪除後好像沒增加空間,鬱悶了…於是發信給客服,整了半天還沒搞定,我們通訊的頻率大概是2小時一次…

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.