試用了一下 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 檔案庫。作法很簡單,只要開啟命令提示字元,切換至專案所在目錄,輸入以下命令:
這就等於把那個資料夾(以及底下全部的子目錄)變成一個 Mercurial 檔案庫了。在根資料夾下會產生一個名為「.hg」的子目錄。此目錄的功能與 Git 的 .git 類似,不可亂動。
上述操作也意味著,無論資料夾是不是空的,只要對那個資料夾執行 hg init 命令,就能把它變成 Mercurial 檔案庫。
如果已經有一個共享的中央檔案庫,則可以直接把遠端檔案庫複製(clone)到本機。稍後會再說明這個操作。
加入檔案
接著是把檔案納入版本控制。命令很簡單:
這樣會把現行目錄下的全部檔案(包含子目錄)都加入版本控制.....等等,這不是我要的。我的 .NET 專案裡面有很多檔案並不需要納入版控,還是先把那些檔案加入忽略清單吧。
忽略清單
底下這份 Mercurial 忽略清單是專門給 .NET 專案使用的,出處在此:https://gist.github.com/Iristyle/1259552(我有稍微改過)。
怎麼用?把這些文字貼到記事本裡面,儲存為「.hgignore」的純文字檔案,放在檔案庫的根目錄下就行了。Mercurial 也支援全域忽略清單,作法是將共用的 .hgignore 檔案放在某共享資料夾,例如 C:\Users\你的帳戶名\,然後修改檔案庫根目錄下的 .hg\hgrc 檔案,在 [ui] 區段中設定 ignore 屬性,像這樣:
如果希望每次建立新檔案庫都直接套用全域設定,也就是連上述修改 hgrc 檔案的動作都要省去,則可以修改全域設定檔 C:\Users\你的帳戶名\mercurial.ini。設定檔不見得會自動產生,可能得自行建立。
另外,忽略清單裡面的檔名比對語法是由 .hgignore 的第一行來控制:
這表示檔案目錄的名稱比對方式要採用 Shell 風格,也就是簡易的萬用字元表示法。如果你需要更細緻的檔名比對,Mercurial 還支援 regular expression。只要在忽略檔案清單的第一行這麼寫:
有關 .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] 區段中設定多組 URL,並且為每一個 URL 指定一個別名,例如:
在推送檔案時,如果已經在 URL 中預先指定使用者帳戶(如剛才範例中的 default),Mercurial 就只會問密碼。如果連密碼都要預先指定,可在 hgrc 裡面加入 [auth] 區段,像這樣:
同樣的推送操作也可以透過 TortoiseHg 的 Hg Workbench 達成,如下圖:
拉回
拉回(pull)就是更新,也就是從遠端檔案庫取回新版本的意思。以下命令可從預設遠端檔案庫拉回新版本:
或者明確指定某個檔案庫別名:
檔案庫別名是預先定義在 hgrc 裡面的 [path] 區段,參考前面「推送」一節的範例。
將遠端檔案庫複製回本機
如果已經有一個共享的中央檔案庫,我們可以直接把遠端檔案庫複製(clone)到本機。做法是先在本機建立一個新的資料夾,然後在此資料夾上點右鍵,再選 TortoiseHg > Clone。接著輸入來源資料夾路徑(或 URL)、目的資料夾路徑,再點 Clone 按鈕即可將來源檔案庫複製一份到本機。參考下圖:
小結
目前我大概就只試了文中提及的幾個基本操作,過程很順利。往後應該還是輸入指令的機會少,仰賴 TortoiseHg 的機會多吧。中文檔名也都沒問題經網友提醒,實際測試「許功蓋」等字元仍有問題。後續更新:我把中文檔名的實驗心得寫在另一篇:Mercurial 的中文檔名編碼問題。
約耳的教學文章裡面提到,他們在使用 Subversion 在進行分支合併的時候「演變成了一場噩夢」,Mercurial 則讓分支「變得可行,你不必再為使用分支而感到恐懼。」這個部分我還沒試過,將來若碰到了,再補上來。
Happy branching!
學習資源
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 就會知道要用那一組帳密來驗證。username 和 password 自然就是帳戶和密碼了。
同樣的推送操作也可以透過 TortoiseHg 的 Hg Workbench 達成,如下圖:
拉回
拉回(pull)就是更新,也就是從遠端檔案庫取回新版本的意思。以下命令可從預設遠端檔案庫拉回新版本:
hg pull
或者明確指定某個檔案庫別名:
hg pull MyLib2
檔案庫別名是預先定義在 hgrc 裡面的 [path] 區段,參考前面「推送」一節的範例。
將遠端檔案庫複製回本機
如果已經有一個共享的中央檔案庫,我們可以直接把遠端檔案庫複製(clone)到本機。做法是先在本機建立一個新的資料夾,然後在此資料夾上點右鍵,再選 TortoiseHg > Clone。接著輸入來源資料夾路徑(或 URL)、目的資料夾路徑,再點 Clone 按鈕即可將來源檔案庫複製一份到本機。參考下圖:
小結
目前我大概就只試了文中提及的幾個基本操作,過程很順利。往後應該還是輸入指令的機會少,仰賴 TortoiseHg 的機會多吧。中文檔名
約耳的教學文章裡面提到,他們在使用 Subversion 在進行分支合併的時候「演變成了一場噩夢」,Mercurial 則讓分支「變得可行,你不必再為使用分支而感到恐懼。」這個部分我還沒試過,將來若碰到了,再補上來。
Happy branching!
有試過"許蓋功"等中文也ok嗎?
回覆刪除之前在survey時好像這些中文字會有問題..
很不幸地,"許功蓋"真的會有問題。本文得修正一下了。多謝告知 :)
回覆刪除我把中文檔名的實驗心得寫在另一篇,若有新發現,歡迎隨時交流。Thanks :)
回覆刪除Git 也能正確處理中文了. Ya!
回覆刪除