程序即人生
Programming is understanding
分布式的,新一代版本控制系統(tǒng)Mercurial的介紹及簡(jiǎn)要入門(mén) 收藏 此文于2009-09-25被推薦到CSDN首頁(yè)
如何被推薦?
分布式的,新一代版本控制系統(tǒng)Mercurial的介紹及簡(jiǎn)要入門(mén)
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
討論新聞組及文件
在經(jīng)歷了《版本控制系統(tǒng)(RCS)的選擇與比較》后,選擇了Mercurial下面給大家介紹一下Mercurial。
一、 提要
本文以假設(shè)你已經(jīng)了解基本的版本控制系統(tǒng)知識(shí),知道諸如庫(kù),歷史,提交等常見(jiàn)的概念,本文簡(jiǎn)要的說(shuō)明了在Windows/Linux下的可用安裝版本,在Google Code上建庫(kù),管理,修改,提交,取回的過(guò)程,基本上僅是平時(shí)開(kāi)發(fā)需要的最基礎(chǔ)的一些功能。(連merge都沒(méi)有說(shuō))因?yàn)橐莆杖魏慰捎玫陌姹竟芾硐到y(tǒng)的全部功能都是一個(gè)復(fù)雜的系統(tǒng)過(guò)程,本文并不期望能包含全部?jī)?nèi)容,僅僅希望作為一個(gè)對(duì)Mercurial的介紹及入門(mén)引導(dǎo),并不對(duì)基本的版本控制概念進(jìn)行過(guò)多的描述。想要進(jìn)一步學(xué)習(xí)Mercurial的可以參考最后的參考資料,個(gè)人比較推薦用《Mercurial 使用教程》入門(mén),然后需要的時(shí)候可以查看《Mercurial: The Definitive Guide》。
二、 介紹
Mercurial與一般傳統(tǒng)的版本控制系統(tǒng)的最大區(qū)別在于分布式的概念。所謂分布式,就是指沒(méi)有一個(gè)所謂的集中的中心(central)庫(kù),這個(gè)庫(kù)一般由svn server(svn),vss administrator(vss)控制,而Mercurial就沒(méi)有這樣的一個(gè)庫(kù),所以使用版本控制的時(shí)候甚至都不需要一個(gè)administrator和server,本地直接建庫(kù),直接就使用,任何一個(gè)庫(kù)都可以作為中心庫(kù),每個(gè)庫(kù)在Mercurial看來(lái)都是平等的。當(dāng)然,實(shí)際使用的時(shí)候,可以人為的去指定一個(gè)中心庫(kù)以作為發(fā)布,但是,這里強(qiáng)調(diào)的是Mercurial本身不關(guān)心這個(gè),對(duì)它來(lái)說(shuō)都是一樣的。Linus他在演講的時(shí)候多次說(shuō)集中式的版本控制系統(tǒng)沒(méi)有前途,因此,Subversion的開(kāi)發(fā)者想要開(kāi)發(fā)一個(gè)更好的CVS其實(shí)是腦子出了毛病-_-!呵呵,實(shí)際上,他雖然說(shuō)得比較過(guò),但是分布式的版本控制的確是比集中式有很多優(yōu)點(diǎn)。
首先,分布式最大的好處就是離線工作,不僅意味著可以不聯(lián)網(wǎng)就享受版本控制的好處,并且也意味著普通的提交速度也要快的多,而且,以此帶來(lái)的巨大靈活性甚至能改變你的工作方式,因?yàn)橐郧凹惺降陌姹究刂葡到y(tǒng),每次提交都會(huì)影響到他人,以至于不能提交未經(jīng)測(cè)試的版本,而使用分布式的版本控制系統(tǒng)時(shí),你可以隨時(shí)隨地的本地提交,安全的保護(hù)自己的工作成果,以防意外,也能隨時(shí)隨地的本地clone,本地分支,本地就是一套完整的版本控制系統(tǒng)!直到修改到最終版本,然后才push(相當(dāng)于集中式版本控制的commit)到真正的一個(gè)公用庫(kù)上去。想到那當(dāng)年作為一個(gè)新員工,每次提交代碼都需要請(qǐng)示總監(jiān)的日子。。。。那是多么痛苦的啊。。。。
其次,對(duì)于個(gè)人開(kāi)發(fā)者來(lái)說(shuō),使用集中式版本控制系統(tǒng)的時(shí)候有沒(méi)有想過(guò),僅僅是一個(gè)人工作,為啥偏要建立一個(gè)中心庫(kù),然后每次將自己的代碼提交到那上面去啊?自己本地一個(gè)副本,庫(kù)還得有一個(gè)副本,也不環(huán)保嘛。呵呵,甚至,我以前還為此專門(mén)架設(shè)了自己的VSS服務(wù)和SVN服務(wù)器-_-!而用分布式的版本控制系統(tǒng)就沒(méi)有那么麻煩了,本地建庫(kù),直接使用就好了^^只有用過(guò)后才知道原來(lái)一切都那么簡(jiǎn)單。。。。。。。。。。。。。并且,當(dāng)你哪天想要將工作成果share出去的時(shí)候,也不麻煩,還是一條普通的push命令,就像遠(yuǎn)方的服務(wù)器一直搭建好了一樣。
但是,其實(shí)目前來(lái)說(shuō),分布式的版本控制系統(tǒng)還是有一定缺陷的,比如權(quán)限控制的問(wèn)題,這點(diǎn)可能因?yàn)镸ercurial的用戶群主要在于開(kāi)源世界,所以沒(méi)有太過(guò)重視,實(shí)際上對(duì)企業(yè)開(kāi)發(fā)可能會(huì)比較重要,相對(duì)來(lái)說(shuō)SVN,特別是VSS就要好的多。但是,事實(shí)上通過(guò)外部的手段進(jìn)行權(quán)限的控制還是可行的(比如ssh的登錄),只不過(guò)相對(duì)來(lái)說(shuō)會(huì)復(fù)雜一點(diǎn),這也算是個(gè)小缺陷了(可大可小)。然后Mercurial相比Git還有個(gè)缺點(diǎn),那就是分支的時(shí)候不能對(duì)單獨(dú)的子目錄進(jìn)行,一次clone就是一個(gè)工程,這樣希望在一個(gè)大工程中對(duì)一個(gè)小項(xiàng)目進(jìn)行分支,會(huì)比較麻煩,這點(diǎn)也算是比較大的缺點(diǎn)了,但是,上述缺點(diǎn)都不是分布式版本控制固有的,僅僅是目前Mercurial的實(shí)現(xiàn)的問(wèn)題,相對(duì)來(lái)說(shuō),分布式和集中式這樣工作方式上的區(qū)別才是最主要的,畢竟Mercurial還年輕,希望Mercurial將來(lái)的實(shí)現(xiàn)會(huì)更好^^
2009-08-08: Mercurial 1.3.1 - Release version
其次是可愛(ài)的烏龜,不過(guò)不叫TortoiseMercurial,而是Tortoisehg(因?yàn)镸ercurial在命令行的命令是HG,不會(huì)有人喜歡Mercurial這樣長(zhǎng)的命令吧-_-!),在
http://bitbucket.org/tortoisehg/stable/wiki/download,找到下載地址,最新版是0.8.2 ,此外,此網(wǎng)址還有個(gè)中文的注冊(cè)表文件zh_CN可以下,下載后直接打開(kāi),可以使的右鍵菜單的語(yǔ)言編程中文(但是設(shè)置中的語(yǔ)言還是E文,為了統(tǒng)一,建議還是用E文的比較好) (BTW:烏龜真是版本控制之王啊。。。。。。。。。從CVS到SVN到Mercurial到Git是無(wú)所不包啊。。。。。。)
要說(shuō)明的是,Mercurial遵循的是典型的Unix風(fēng)格,即自己只做命令行功能,圖形界面留給了別人做,所以官方版本僅僅只有命令行功能,TortoiseHg是在Windows下較好的一種,這里向大家推薦一下。實(shí)際上安裝完TortoiseHg后,已經(jīng)包含了完整的官方版本,畢竟,TortoiseHg僅僅是Mercurial的一個(gè)GUI前端而已。下載后,安裝的流程就不多說(shuō)了,無(wú)非就是下一步。。。。不會(huì)的話也不會(huì)想要使用這個(gè)軟件了。(安裝后,想使用中文的就再打開(kāi)上面的中文菜單注冊(cè)表文件。) 再然后,就可以在右鍵中看到菜單。
2. Linux
對(duì)于官方版本來(lái)說(shuō),Ubuntu下利用
apt-get install mercurial
就行
Redhat就用yum吧,都有可用版本。不過(guò)在我的kubuntu9.04上安裝的是1.01版本,實(shí)在太老了。
而TortoiseHg在Linux也可用(事實(shí)上,仔細(xì)觀察一下Windows版本的TortoiseHg就知道,其實(shí)它本質(zhì)上是個(gè)GTK程序-_-!)
Linux
Debian packages are coming soon.
Fedora RPM packages:
0.8.2 - x86
nautilus 0.8.2 - x86
0.8.2 - x64
nautilus 0.8.2 - x64
If no package yet exists for your platform, then use the source install method described on the hgtk page. Note that we do not suggest that you run from a tarball, even though we make one available for download. We prefer you use a local clone of TortoiseHg instead. If you do decide to use a tarball, you'll want to delete thgutil/config.py* to remove the hard-coded paths.
不翻譯了,這里說(shuō)明一下。。。。。launchpad是出品ubuntu的公司建立的一個(gè)源代碼host,上述鏈接上有介紹使用方法,基本上如同普通的程序一樣,通過(guò)apt-get獲取key,然后修改apt-get在/etc/apt/下的source.list,添加進(jìn)新的ppa的源(有3個(gè)),然后通過(guò)apt-get update更新一下源的信息,就可以直接通過(guò)apt-get install tortoisehg來(lái)下載了,這時(shí)下載的mercurial會(huì)是最新的1.3版本,而不是原來(lái)的1.01老版了。
我用的是kubuntu,沒(méi)有用tortoisehg,因?yàn)槟菢右惭b一整套的gtk庫(kù),用gnome的人就幸福了^^唉。。。這也是當(dāng)年選擇了Qt的后遺癥啊。。。。。。。。。。
3. Eclipse
Eclipse由于是Windows,Linux通用的,所謂單獨(dú)放在這里了,呵呵,JAVA程序的這個(gè)優(yōu)點(diǎn)還是挺吸引人的,說(shuō)到這里感嘆一下,JAVA程序員哪能理解學(xué)習(xí)了CreateProcess然后重新學(xué)習(xí)fork,execxxx,學(xué)習(xí)了CreateThread,然后學(xué)習(xí)pthread_create的痛苦啊。。。。。呵呵,這些都是題外話。另外,eclipse插件的管理,你得首先安裝對(duì)應(yīng)的原始官方版本。。。
4. 檢驗(yàn)安裝
首先檢驗(yàn)已經(jīng)安裝成功,可以查看一下官方的版本
Windows下:
E:\work>hg version
Mercurial Distributed SCM (version 1.3.1+1444a42f6052)
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Linux下:
分布式軟件配置管理工具 - 水銀 (版本 1.3.1)
這是自由軟件,具體參見(jiàn)版權(quán)條款。這里沒(méi)有任何擔(dān)保,甚至沒(méi)有適合
特定目的的隱含的擔(dān)保。
呵呵,在通過(guò)ppa那個(gè)鏈接安裝了新版后,竟然版權(quán)信息是中文的。。。。并且,Mercurial翻譯成了水銀,這點(diǎn)比較讓人吐血。事實(shí)上Mercurial表示墨丘利。。。。。也就是希臘神話中的赫爾墨斯(Hermes)。。。。。。
見(jiàn)WIKI的說(shuō)明:
墨丘利(Mercurius)是羅馬神話中為眾神傳遞信息的使者,相對(duì)應(yīng)于希臘神話的赫耳墨斯(Hermes)。他的形象一般是頭戴一頂插有雙翅的帽子,腳穿飛行鞋,手握魔杖,行走如飛。墨丘利是裘比特和瑪亞的兒子,是醫(yī)藥、旅行者、商人和小偷的保護(hù)神,西方藥店經(jīng)常用他的纏繞兩條蛇的手杖作為標(biāo)志。
此外,由于水星在天上運(yùn)行的速度很快,所以亦用了他的名字而命名。
怎么說(shuō)。。。。。。。。。。。我都覺(jué)得Matt Mackall原意是指墨丘利吧-_-!又扯遠(yuǎn)了。。。。。
說(shuō)明安裝成功。。。。。。。。。。。。。
四、 簡(jiǎn)要使用說(shuō)明
因?yàn)樵赪indows下和在Linux下使用Mercurial是類似的(命令行嘛,能差別大到哪去),這里以Windows下的使用為例,之所以使用Windows為例而不是用Linux因?yàn)槲矣玫氖荳ord2007編輯所以復(fù)制結(jié)果比較方便,之所以用Word2007是因?yàn)榭截惖絀E中的CSDN blog編輯框中比較方便,之所以用IE是因?yàn)镃SDN blog對(duì)Firefox的支持不好。。。。。。。。這里抱怨一下-_*!。。。。。
下面的小標(biāo)題括號(hào)中的英文即是對(duì)應(yīng)的Mercurial命令。
1. 幫助(help)
從上面的檢驗(yàn)安裝方法可以看出來(lái),Mercurial的命令是Hg。
首先,因?yàn)槲也荒軐⑺械拿疃贾v完,所以先告訴大家怎么用幫助^^,我果然很取巧-_-!
Mercurial有內(nèi)建的幫助系統(tǒng),參數(shù)是help,help后還可以以需要查詢的命令為參數(shù)。
比如:
E:\work>hg help init
hg init [-e CMD] [--remotecmd CMD] [DEST]
create a new repository in the given directory
Initialize a new repository in the given directory. If the given
directory does not exist, it will be created.
If no directory is given, the current directory is used.
It is possible to specify an ssh:// URL as the destination.
See 'hg help urls' for more information.
options:
-e --ssh specify ssh command to use
--remotecmd specify hg command to run on the remote side
use "hg -v help init" to show global options
2. 建庫(kù)(init)
上面的幫助內(nèi)容,懂E文的的就看懂了,init就是Mercurial的建庫(kù)命令,使用方法如此簡(jiǎn)單。比如我希望在E:\Work\Hello下建立一個(gè)我自己的庫(kù),只需要在e:\Work\Hello目錄輸入hg init如下:
E:\work\hello>hg init
E:\work\hello>
事實(shí)上,你看不到任何輸出,但是通過(guò)dir查看的時(shí)候會(huì)發(fā)現(xiàn)多出的.hg目錄(在Linux因?yàn)槭?#8220;.”開(kāi)頭,默認(rèn)是隱藏的),而Windows下沒(méi)有這個(gè)規(guī)矩,所以還是會(huì)顯示出來(lái)。想起一個(gè)笑話,以前有個(gè)牛人說(shuō),為啥.Net叫.Net?因?yàn)樵贚inux下甚至都不會(huì)顯示出來(lái)^^
這個(gè)時(shí)候一個(gè)你自己的Mercurial庫(kù)就建好了:)
3. 克隆(clone)
事實(shí)上,我機(jī)器上還是保留了svn,因?yàn)槲铱梢院芊奖愕脑趕ourceforge和Google code上下載別人的代碼-_-!用的是svn co命令,事實(shí)上,大部分人用的最多的也就是這個(gè)命令了^^,在mercurial上將svn和VSS的checkout代碼命令叫做克隆(clone),事實(shí)上也體現(xiàn)了不同的版本控制系統(tǒng)的管理哲學(xué)。集中庫(kù)嗎,需要的是檢出(checkout)然后遷入(commit),而分布式呢,因?yàn)榫蜎](méi)有集中庫(kù)的概念,你需要做的是在一個(gè)人為指定的集中庫(kù)上克隆一份,你自己的庫(kù)也就是與服務(wù)器上的庫(kù)一樣的庫(kù)(克隆的概念^^)
首先看下幫助,(這里只貼上了第一行):
E:\work>hg help clone
hg clone [OPTION]... SOURCE [DEST]
即hg clone 源 目標(biāo)
比如,以后我準(zhǔn)備將代碼都放在Google Code上共享,而Google Code對(duì)Mercurial原生支持(哈雷路亞),所以,大家可以直接通過(guò)clone命令去隨意克隆我的代碼,我的博客sample代碼存放的Mercurial的地址是
那么大家只需要通過(guò)如下命令就能下載回去我所有的Sample代碼:(當(dāng)然,Mercurial要是已經(jīng)安裝好的,并且在你想要下載的位置執(zhí)行下列命令(google推薦的用法)
這樣,就將我所有的blog sample代碼全部clone到當(dāng)前目錄的jtianling-blog-sample-code目錄下了。
如下所示:
E:\work\jtianling-blog-sample-code>dir/w
驅(qū)動(dòng)器 E 中的卷是 文檔
卷的序列號(hào)是 940C-1FF8
E:\work\jtianling-blog-sample-code 的目錄
[.] [..] [.hg] [2009-9-25]
0 個(gè)文件 0 字節(jié)
4 個(gè)目錄 3,043,004,416 可用字節(jié)
E:\work\jtianling-blog-sample-code>
目前僅僅有在E:\work\jtianling-blog-sample-code\2009-9-25\helloMercurial下添加進(jìn)去的一個(gè)文本,helloMercurial.txt。
好了,僅僅想學(xué)會(huì)怎么用Mercurial去享用別人代碼的人可以放心的走了,一切很簡(jiǎn)單吧:)
4. 本地提交(commit)
Mercurial也有commit,不過(guò)這里的commit與VSS,SVN中的不同,這里的commit僅僅提交到本地,所以題目特意強(qiáng)調(diào)了一下,是本地的提交,這再一次的體現(xiàn)了命令反應(yīng)哲學(xué)的問(wèn)題^^。在Mercuria里面,你可以放心的commit,因?yàn)椴粫?huì)影響到別人。
比如,剛才我clone回來(lái)的文本helloMercurial.txt內(nèi)容是:
Hello World
To Test Mercruail and Google Code
Create By JTianLing
我將其修改一下
Hello World
To Test Mercruail and Google Code
And Test Commit
Create By JTianLing
然后提交,命令如下:
E:\work\jtianling-blog-sample-code>hg commit
這個(gè)時(shí)候,在Windows下,直接彈出的是默認(rèn)的文本編輯工具,我這里是記事本,有如下提示信息:
HG: Enter commit message. Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: JTianLing
HG: branch 'default'
HG: changed 2009-9-25/helloMercurial/helloMercurial.txt
告訴你輸入提交的message,沒(méi)有的話是會(huì)終止提交的,這也體現(xiàn)了一種好的軟件版本管理哲學(xué),每次提交都強(qiáng)制性的要求有說(shuō)明的,VSS中由于可以忽略說(shuō)明,所以事實(shí)上,我們公司是沒(méi)有任何人提交帶說(shuō)明的,然后呢?碰到問(wèn)題的時(shí)候就靠喊貝,反正在一個(gè)公司-_-!這里,我加入一行:
Add a Line to Test commit command
然后保存退出。這時(shí)候提交就已經(jīng)完成了。
5. 記錄(log)
怎么確認(rèn)提交完成沒(méi)有,怎么查看版本歷史,用log命令,執(zhí)行效果如下:
E:\work\jtianling-blog-sample-code>hg log
changeset: 1:88252aa4d260
tag: tip
user: JTianLing
date: Fri Sep 25 12:27:01 2009 +0800
summary: Add a Line to Test commit command
changeset: 0:baf69ca9684e
user: JTianLing
date: Fri Sep 25 12:00:01 2009 +0800
summary: Create Project Blog
E:\work\jtianling-blog-sample-code>
可以看到我說(shuō)明的Add a Line to Test commit command版本已經(jīng)commit了。但是這個(gè)時(shí)候其實(shí)是不影響google上的任何東西的啊:)google上該是啥還是啥。
6. 版本同步(push,pull)
當(dāng)我真的需要將修改提交到服務(wù)器上怎么做呢?用push(推)出去自己的版本:)事實(shí)上,這還是牽涉到版本管理哲學(xué)的問(wèn)題,因?yàn)間oogle code上host的那個(gè)庫(kù)在Mercurial看來(lái)也就是一個(gè)普通的庫(kù),沒(méi)有什么特殊的,你僅僅是將自己的庫(kù)強(qiáng)行推給它,將它的庫(kù)修改而已。同理,當(dāng)你想要放棄修改,需要做的就是將google code上的庫(kù)pull(拉)回來(lái)。比如,我想同步修改google code上我的那個(gè)文本。
命令及輸出如下:
searching for changes
http authorization required
realm: Google Code Mercurial Repository
user: JTianLing
password:
Success.
當(dāng)然,在google code上push是需要用戶名和密碼的,完成后顯示Success,然后你再去clone的時(shí)候會(huì)發(fā)現(xiàn)內(nèi)容已經(jīng)變了。
這里我們確認(rèn)一下,通過(guò)下面的命令,我們?cè)賑lone一份放到j(luò)tianling-blog-sample-code2目錄中去。
requesting all changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files
updating working directory
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
E:\work>
這里,會(huì)發(fā)現(xiàn)輸出的信息也與第一次看到的不同了,這里已經(jīng)有兩個(gè)changesets了,需要說(shuō)明的是Mercurial是基于changesets管理的版本控制系統(tǒng)與git基于內(nèi)容管理(snapshot)管理的方式不同。在Mercurial中,一個(gè)系統(tǒng)就是通過(guò)一個(gè)一個(gè)changesets累加起來(lái)的。
這里,可以看到新的內(nèi)容了(按照本文的說(shuō)明,你下的時(shí)候就已經(jīng)是新的內(nèi)容了)
五、 小結(jié)
事實(shí)上Mercurial的命令遠(yuǎn)不止這一些,詳細(xì)的內(nèi)容還是那句話,希望大家可以查看教程《Mercurial 使用教程》與《Mercurial: The Definitive Guide》,一篇小文,難以承載那么多東西,呵呵,何況,也沒(méi)有必要做太多前人已經(jīng)做好的工作。《Mercurial 使用教程》作為入門(mén)非常不錯(cuò),并且還是中文的,推薦給大家。而且,我說(shuō)的都是命令行下面的操作,但是,事實(shí)上命令行都懂了,圖形操作就更不用說(shuō)了,主要的是理解這些命令對(duì)應(yīng)的分布式版本控制管理概念就好。
我寫(xiě)此文的目的其實(shí)主要是因?yàn)橐院髸?huì)將blog中的sample代碼都放在上述示例的那個(gè)工程中,而我會(huì)使用Mercurial,為了不需要每次都向大家解釋怎么樣才能用Mercurial clone回代碼,特別寫(xiě)此文簡(jiǎn)單的介紹一下。
六、 參考資料:
需要詳細(xì)了解Mercurial的話,這里有幾篇非常好的教程
1. 《Mercurial: The Definitive Guide》,By Bryan O'Sullivan。最好的Mercurial教程,就是篇幅巨大
2. 《A tutorial on using Mercurial》,官方推薦的一個(gè)教程E文版
3. 《Mercurial 使用教程》,上面那個(gè)教程的中文版,!推薦!
4. 《Mercurial快速入門(mén)》,一個(gè)中文的快速入門(mén)教程,事實(shí)上僅僅翻譯了標(biāo)題-_-!
5. 《Mercurial manual 》,作者就是Mercurial的作者。
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
發(fā)表于 @ 2009年09月25日 13:05:00 | 評(píng)論( 5 ) | 編輯| 舉報(bào)| 收藏