淺嚐 Mercurial 分散式版本控制系統

試用了一下 Mercurial,覺得蠻好。

學習資源

Mercurial 和 Git 一樣是分散式版本控制系統,若有用過 Subversion 或 Git,學習 Mercurial 會容易許多。

對初學者來說,我覺得 Hg Init 這份教學文件很有幫助,作者是大名鼎鼎的約耳。對,就是約耳談軟體的那個約耳。這份教學文件有簡體中文版

還有一本書可以參考:Mercurial: The Definitive Guide。紙本由歐萊里出版,亦可線上閱讀。

等到基本用法大致了解,往後日常操作時可能就會需要一些指令集的快速參考,此時小抄就非常好用了。官網有列出一堆 Mercurial 小抄,其中還有簡體中文版,真有心。

底下是我初次使用的一點筆記。

初次使用

第一次使用 Mercurial,是嘗試把既有的 Git 檔案庫推送至免費空間 Bitbucket

Bitbucket 支援兩種 DVCS 檔案庫:Git 和 Mercurial,而且還提供 issue tracker 和 wiki 服務,挺不錯。而且,它支援私人檔案庫,不會強制要求你將檔案庫公開。

首先當然是要安裝 Mercurial + TortoiseHg,for windows 的版本。工具裝好之後,接著就可以建立檔案庫。

檔案庫

我先找個既有的 Git 工作副本,把裡面的 .git 資料夾刪除,然後把它變成 Mercurial 檔案庫。作法很簡單,只要開啟命令提示字元,切換至專案所在目錄,輸入以下命令:

hg init

這就等於把那個資料夾(以及底下全部的子目錄)變成一個 Mercurial 檔案庫了。在根資料夾下會產生一個名為「.hg」的子目錄。此目錄的功能與 Git 的 .git 類似,不可亂動。

上述操作也意味著,無論資料夾是不是空的,只要對那個資料夾執行 hg init 命令,就能把它變成 Mercurial 檔案庫。

如果已經有一個共享的中央檔案庫,則可以直接把遠端檔案庫複製(clone)到本機。稍後會再說明這個操作。

加入檔案

接著是把檔案納入版本控制。命令很簡單:

hg add

這樣會把現行目錄下的全部檔案(包含子目錄)都加入版本控制.....等等,這不是我要的。我的 .NET 專案裡面有很多檔案並不需要納入版控,還是先把那些檔案加入忽略清單吧。

忽略清單

底下這份 Mercurial 忽略清單是專門給 .NET 專案使用的,出處在此:https://gist.github.com/Iristyle/1259552(我有稍微改過)。

syntax: glob
 
*.*scc
*.FileListAbsolute.txt
*.aps
*.bak
*.[Cc]ache
*.clw
*.eto
*.exe
*.fb6lck
*.fbl6
*.fbpInf
*.ilk
*.lib
*.log
*.ncb
*.nlb
*.obj
*.patch
*.pch
*.pdb    
*.plg
*.[Pp]ublish.xml
*.rdl.data
*.sbr
*.scc
*.sig
*.sqlsuo
*.suo
*.svclog
*.tlb
*.tlh
*.tli
*.trends
*.tmp
*.user
*.vshost.*
*DXCore.Solution
*_i.c
*_p.c
Ankh.Load
Backup*
CVS/
[Pp]recompiled[Ww]eb/
UpgradeLog*.*
[Bb]uildArtifacts/
[Bb]in/
[Dd]ebug/
[Ll]ogs/
[Oo]bj/
[Rr]elease/
[Ss]andcastle/[Dd]ata
[Tt]humbs.db
_[Uu]pgradeReport_[Ff]iles
_[Rr]e[Ss]harper.*/
hgignore[.-]*
ignore[.-]*
svnignore[.-]*
lint.db
.DS_Store
[Cc]lientBin/
[Ii]ndex.dat
[Ss]torage.dat
*.sln.docstates
*.dbmdl

怎麼用?把這些文字貼到記事本裡面,儲存為「.hgignore」的純文字檔案,放在檔案庫的根目錄下就行了。Mercurial 也支援全域忽略清單,作法是將共用的 .hgignore 檔案放在某共享資料夾,例如 C:\Users\你的帳戶名\,然後修改檔案庫根目錄下的 .hg\hgrc 檔案,在 [ui] 區段中設定 ignore 屬性,像這樣:

[ui]
ignore = %USERPROFILE%\.hgignore

如果希望每次建立新檔案庫都直接套用全域設定,也就是連上述修改 hgrc 檔案的動作都要省去,則可以修改全域設定檔  C:\Users\你的帳戶名\mercurial.ini。設定檔不見得會自動產生,可能得自行建立。

另外,忽略清單裡面的檔名比對語法是由 .hgignore 的第一行來控制:

syntax: glob

這表示檔案目錄的名稱比對方式要採用 Shell 風格,也就是簡易的萬用字元表示法。如果你需要更細緻的檔名比對,Mercurial 還支援 regular expression。只要在忽略檔案清單的第一行這麼寫:

syntax: regexp

有關 .hgignore 的語法和相關說明,可參考這份文件:Syntax for Mercurial ignore files(有簡體中文版)。

提交

把 .hgignore 放在檔案庫的根目錄下,接著就可以執行 hg add 命令,把檔案納入版控,然後 commit(check in)至檔案庫了。

DVCS 的一個好處,就是開發人員可以經常 commit,而不用擔心影響別人。這是因為 commit 操作只會變更本機的檔案庫。等到自己覺得是時候了,該與他人的程式碼整合了,便可將自己變更的部分(變更集)推送至遠端伺服器上的中央檔案庫(central repository)。

推送

將本機變更的部分推送至中央檔案庫的命令是:hg push

我先前只是把一個 .NET 專案變成本機的 Mercurial 檔案庫而已,現在要將它推送至遠端伺服器,當然就得知道遠端檔案庫的位址。

Bitbucket 的檔案庫 URL 可以透過下圖的方式得知:


取得遠端(中央)檔案庫的 URL 之後,修改本機檔案庫的 .hg\hgrc,在 [paths] 區段中指定推送(push)時的預設遠端檔案庫 URL。像這樣:

[paths]
default = https://使用者帳戶@blah.blah.com/huanlin/mylib

於是在推送檔案時,輸入的指令就很簡單:

hg push

當然也可以在 [paths] 區段中設定多組 URL,並且為每一個 URL 指定一個別名,例如:

[paths]
default = https://使用者帳戶@blah.blah.com/huanlin/mylib
MyLib1 = https://bitbucket.org/mylib1
MyLib2 = https://bitbucket.org/mylib2

在推送檔案時,如果已經在 URL 中預先指定使用者帳戶(如剛才範例中的 default),Mercurial 就只會問密碼。如果連密碼都要預先指定,可在 hgrc 裡面加入 [auth] 區段,像這樣:

[auth]
bb.prefix = https://bitbucket.org/BlahBlah/
bb.username = 使用者帳戶
bb.password = 密碼

其中的前導字串 "bb." 只是用來區別多組帳戶密碼,可自由命名。prefix 是用來比對 URL 用的,可使用萬用字元。例如 push 至遠端的 https://michael@bitbucket.org/michael/MyLib 時,目的 URL 有包含 prefix 時,Mercurial 就會知道要用那一組帳密來驗證。usernamepassword 自然就是帳戶和密碼了。

同樣的推送操作也可以透過 TortoiseHg 的 Hg Workbench 達成,如下圖:

拉回

拉回(pull)就是更新,也就是從遠端檔案庫取回新版本的意思。以下命令可從預設遠端檔案庫拉回新版本:

hg pull

或者明確指定某個檔案庫別名:

hg pull MyLib2

檔案庫別名是預先定義在 hgrc 裡面的 [path] 區段,參考前面「推送」一節的範例。

將遠端檔案庫複製回本機

如果已經有一個共享的中央檔案庫,我們可以直接把遠端檔案庫複製(clone)到本機。做法是先在本機建立一個新的資料夾,然後在此資料夾上點右鍵,再選 TortoiseHg > Clone。接著輸入來源資料夾路徑(或 URL)、目的資料夾路徑,再點 Clone 按鈕即可將來源檔案庫複製一份到本機。參考下圖:



小結

目前我大概就只試了文中提及的幾個基本操作,過程很順利。往後應該還是輸入指令的機會少,仰賴 TortoiseHg 的機會多吧。中文檔名也都沒問題經網友提醒,實際測試「許功蓋」等字元仍有問題。後續更新:我把中文檔名的實驗心得寫在另一篇Mercurial 的中文檔名編碼問題

約耳的教學文章裡面提到,他們在使用 Subversion 在進行分支合併的時候「演變成了一場噩夢」,Mercurial 則讓分支「變得可行,你不必再為使用分支而感到恐懼。」這個部分我還沒試過,將來若碰到了,再補上來。

Happy branching!

4 則留言:

  1. 有試過"許蓋功"等中文也ok嗎?
    之前在survey時好像這些中文字會有問題..

    回覆刪除
  2. 很不幸地,"許功蓋"真的會有問題。本文得修正一下了。多謝告知 :)

    回覆刪除
  3. 我把中文檔名的實驗心得寫在另一篇,若有新發現,歡迎隨時交流。Thanks :)

    回覆刪除
  4. Git 也能正確處理中文了. Ya!

    回覆刪除

技術提供:Blogger.
回頂端⬆️