本篇介紹Mercurial。
因為這是我現在用得最多的SCM——最近一個月來幾個程式都在用它——所以會說得詳細一些。
我是從雲風的BLOG裡看到關於Mercurial的介紹,他在文章中介紹了常用的幾種DRCS,他個人推薦的是Darcs,但我卻看中了Mercurial。
Mercurial 的優點在於功能強大並且速度超快(相對Bazaar而言,與SVN相比似乎也快一些),看源碼Mercurial也是用Python寫的,只不過發布版像 是用PY2EXE等工具編譯成的EXE,不知道為什麼速度會這麼快。缺點是操作遠程Repository的功能需要一些服務端的安裝配置工作,這點不如 Bazaar方便。
關於Mercurial的使用推薦參考這裡的兩頁文檔,很實用。Mercurial的操作命令雖然跟Bazaar差不多,但是設計思路比Bazaar更加“分布”一些,與傳統SCM差別較大,可能需要一段時間適應。
安裝很簡單,在這裡下載最新版本的安裝程式安裝一下就好了。
不過要在Windows下通過SSH使用遠程Repository的話,需要一些額外的安裝配置工作。如果你使用的不是Windows或者在Windows上已經安裝了帶有ssh命令的Cygwin,可以跳過下面這一部分,直接到後面的“Mercurial的使用”部分。
首先在這裡下載一個PuTTY的工具程式:plink.exe。
然後在Mercurial的安裝目錄下找到mercurial.ini檔案,用編輯器開啟,找到[ui]段增加如下兩行:
ssh = D:/tools/plink.exe -ssh -pw password
username = username<username@sitename.com>
username項很好理解,就相當於Bazaar裡的whoami命令——我不知道為什麼Mercurial沒有這個命令,而是預設使用loginname@hostname的形式來標記目前使用者,大概它覺得這隻是標誌,沒有什麼關係,反正它擁有超強的分支/合并功能。
ssh 項就是與SSH有關的設定項目了。按照參考文檔中所說的,Mercurial通過ssh操作遠程Repository時可以互動提示輸入登入密碼,但是我 在Windows下實驗失敗,可能是plink的問題。所以在第一次從遠程Repository上clone到本地repository時需要在這裡用- pw選項輸入登入密碼(不過用完就可以去掉這一項了——因為不同的項目可能使用不同的遠程Repository,所以就可能使用不同的使用者和密碼,那個時 候可以配置到項目的.hgrc裡,詳見後面的說明)。
Mercurial的使用:
完成必要的安裝配置工作以後就可以開始使用了。
Mercurial的命令是hg——就是汞。不過說實話,我看到Mercurial這個詞想到的是水星。
開始一個項目有兩種情況:一是還沒有任何Repository的全新項目;二是加入一個已經有的項目——通常已經建立了一個公用的遠程Repository。
第一種情況的流程大致是這樣:
1、建立本地Repository。在項目的工作目錄下運行:
hg init
將會建立一個.hg的目錄。
2、設定項目目錄(可選)。主要內容有兩項,一個是配置.hgignore,把不需要加入管理的檔案排除掉;另一個是配置.hgrc,主要是配置ssh(此項僅針對在Windows下用plink進行SSH串連的情況):
.hgignore檔案放在項目的根目錄上,其內容舉例如下:
syntax: glob
*.py[co]
*.swp
*~
使用方法一看就明了,就不解釋了。
.hgrc檔案放在.hg目錄中,其內容舉例如下:
[paths]
default = ssh://username@remotehost//home/username/projname
default-push = ssh://username@remotehost//home/username/projname
[ui]
ssh = D:/tools/plink.exe -ssh -pw password
其中paths段裡的default/default-push分別是對遠程下載上傳的預設url,這樣在作pull/push操作時可以不必每次輸入這個URL。如果SSH不是配置在標準的22連接埠上,可以在remotehost後面加上(:port)指定連接埠號碼。
ui段裡的配置與Mercurial.ini是一樣的格式和含義。在Windows下使用plink串連SSH需要在這裡用-pw選項配置登入密碼,以使pull/push操作能夠正常工作。
3、檢查項目狀態。命令為:
hg status
將會列出所有未commit的有效專案檔及其狀態——如果在commit以後專案檔未任何修改,此操作將無反饋資訊。
比如在剛初始化完以後進行檢查,將會列出所有專案檔(被.hgignore排除的檔案將不顯示),並在前面有一個?標誌,表示這些檔案尚未被版本管理。
在作完第一次add操作以後檢查,則?標誌將變為A標誌,表示是新增的檔案。
如果在commit以後有檔案被修改過,則狀態檢查會列出這些被修改過的檔案,並加上M標誌。
如果在commit以後有檔案被刪除或改名,則狀態檢查會把這些檔案加上!標誌——改名後的新檔案則會作為未管理的新檔案而加上?標誌。
需要從本地Repository裡刪除!標誌檔案則需要使用remove命令,詳見後面的說明。
4、將專案檔加入本地Repository。命令很簡單:
hg add
即可將項目目錄中除了在.hgignore中被排除的檔案以外的所有檔案都加入到本地Repository中(當然不包括.hg目錄,但是會包括.hgignore檔案本身)。
5、將變更提交到本地Repository。命令為:
hg commit -m "關於本次提交的說明文本"
6、提交到遠程Repository。這裡只介紹通過SSH提交的方法,通過HTTP的方法請自行參考相關文檔。
首先需要在服務端安裝Mercurial,如果是用Linux伺服器的話,參考各發行版說明,ubuntu下的安裝是很簡單的,直接用:
sudo apt-get install mercurial
即可。
然後在服務端的項目目錄下建立一個空的Repository(bazaar不需要這樣的步驟,它可以用SFTP直接在空目錄裡遠程建立):
cd /home/username/projname
hg init
最後就可以在用戶端推送Repository了,在項目目錄下運行:
hg push ssh://username@remotehostname//home/username/projname
如果配置了.hgrc裡的paths段的default-push,則可以直接用:
hg push
如果提交失敗,請檢查.hgrc和/或mercurial.ini裡是否正確地配置了plink的pw選項,或者是SSH的連接埠號碼是否正確。如果配置無誤仍然失敗,可以用debug選項看一下詳細出錯資訊:
hg push --debug
再來看第二種情況,即已經存在遠程公用Repository的情況。
1、首先建立本地的副本:
hg clone ssh://username@remotehostname//home/username/projname
注意,在Windows+plink的情況下,必須先在mercurial.ini裡配置plink的pw選項,否則不能正常工作——此時還沒有.hgrc可以配置,所以只能用mercurial.ini這個全域配置。
正常執行以後將在目前的目錄下建立一個projname的子目錄,其中包含了本地Repository(.hg目錄)和工作目錄的全部內容。
2、通常還是需要配置一下.hgrc(可選),不過.hgignore會一起被clone下來,一般不必再配置。
3、status/add/commit/push等命令與第一種情況相同。
現在再來看兩種情況都需要的一些別的操作:
1、刪除檔案:
hg remove path/filename
刪除後的檔案在status命令結果裡將被標誌為R。需要用萬用字元刪除多個檔案時,可以使用-I選項:
hg remove -I path/wildcard .
2、從遠程Repository取得別人加入的更新:
hg pull ssh://username@remotehostname//home/username/projname
同樣,如果配置了.hgrc,就可以不用輸入URL,直接用:
hg pull
取得更新。不過此操作只是更新本地Repository,你還需要用:
hg update
來更新工作目錄下的檔案。
如果發生變更衝突,此操作會自動進行merge,對於不能自動merge的部分,會彈出預設編輯器(可以在mercurial.ini裡配置)要求手工處理。處理完成後會在本地Repository實現自動合并。
3、關於push的補充:
當向一個遠程repository作push操作時,如果之前有別人的push內容,本次push將自動產生一個分支,你需要作一次pull操作把所有分支下載到本地repository進行merge。
4、除了status檢查工作目錄狀態以外,還有幾個命令用於檢查本地Repository狀態:
hg head
hg heads
hg log
其中head命令顯示當前本地Repository中工作分支的最新版本的提交資訊。heads命令顯示當前本地Repository中所有未合并分支的最新版本的提交資訊。log命令則是顯示提交的記錄。
Mercurial 還有一套很強的變更打包解包功能,即一個開發人員可以把自己本地Repository中的變更記錄打包發給別人,別的開發人員得到這個變更包以後,可以解包到 自己的Repository裡,這樣就可以連公用的遠程Repository也不需要。這樣的“分布式”真是太徹底了。
更多關於Mercurial的資訊請參考這裡。
(未完待續)