分布式版本控制(三)

來源:互聯網
上載者:User

本篇介紹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的資訊請參考這裡。

(未完待續)

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.