分布式版本控制(三)

2021-08-22 14:31:48 字數 4447 閱讀 9658

本篇介紹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的使用」部分。

ssh = d:\tools\plink.exe -ssh -pw password

username = username

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

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的方法請自行參考相關文件。

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的補充:

4、除了status檢查工作目錄狀態以外,還有幾個命令用於檢查本地repository狀態:

hg head

hg heads

hg log

其中head命令顯示當前本地repository中工作分支的最新版本的提交資訊。heads命令顯示當前本地repository中所有未合併分支的最新版本的提交資訊。log命令則是顯示提交的歷史記錄。

mercurial 還有一套很強的變更打包解包功能,即乙個開發者可以把自己本地repository中的變更記錄打包發給別人,別的開發者得到這個變更包以後,可以解包到 自己的repository裡,這樣就可以連公共的遠端repository也不需要。這樣的「分布式」真是太徹底了。

更多關於mercurial的資訊請參考這裡。

(未完待續)

分布式版本控制

git基本概念 git倉庫 儲存所有資料的地方 工作區 從倉庫中提取出來的檔案,放在磁碟上供你使用或修改 暫存區 就是乙個檔案,索引檔案,儲存了下次將提交的檔案列表資訊 版本控制軟體 1 集中式版本控制軟體 cvs svn subversion 2 分布式版本控制軟體 git bitkeeper 收...

GIT分布式版本控制

git config global user.name your name git config global user.email email example.com git init初始化建立版本庫 git clone url從網路上轉殖repository,注意clone是複製了history...

分布式版本控制(二)

本篇介紹bazaar 我知道bazaar是從livid那裡看到的,他這篇介紹基本上就是翻譯bazaar官方的乙個快速入門文件,強烈推薦參考一下。bazaar 的缺點是速度太慢。它的慢倒不是像雲風所說的那樣,對大專案太慢,而是因為它是純python的程式,在windows下每次執行都要啟動python...