程序即人生
Programming is understanding
分布式的,新一代版本控制系統Mercurial的介紹及簡要入門 收藏 此文于2009-09-25被推薦到CSDN首頁
如何被推薦?
分布式的,新一代版本控制系統Mercurial的介紹及簡要入門
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
討論新聞組及文件
在經歷了《版本控制系統(RCS)的選擇與比較》后,選擇了Mercurial下面給大家介紹一下Mercurial。
一、 提要
本文以假設你已經了解基本的版本控制系統知識,知道諸如庫,歷史,提交等常見的概念,本文簡要的說明了在Windows/Linux下的可用安裝版本,在Google Code上建庫,管理,修改,提交,取回的過程,基本上僅是平時開發需要的最基礎的一些功能。(連merge都沒有說)因為要掌握任何可用的版本管理系統的全部功能都是一個復雜的系統過程,本文并不期望能包含全部內容,僅僅希望作為一個對Mercurial的介紹及入門引導,并不對基本的版本控制概念進行過多的描述。想要進一步學習Mercurial的可以參考最后的參考資料,個人比較推薦用《Mercurial 使用教程》入門,然后需要的時候可以查看《Mercurial: The Definitive Guide》。
二、 介紹
Mercurial與一般傳統的版本控制系統的最大區別在于分布式的概念。所謂分布式,就是指沒有一個所謂的集中的中心(central)庫,這個庫一般由svn server(svn),vss administrator(vss)控制,而Mercurial就沒有這樣的一個庫,所以使用版本控制的時候甚至都不需要一個administrator和server,本地直接建庫,直接就使用,任何一個庫都可以作為中心庫,每個庫在Mercurial看來都是平等的。當然,實際使用的時候,可以人為的去指定一個中心庫以作為發布,但是,這里強調的是Mercurial本身不關心這個,對它來說都是一樣的。Linus他在演講的時候多次說集中式的版本控制系統沒有前途,因此,Subversion的開發者想要開發一個更好的CVS其實是腦子出了毛病-_-!呵呵,實際上,他雖然說得比較過,但是分布式的版本控制的確是比集中式有很多優點。
首先,分布式最大的好處就是離線工作,不僅意味著可以不聯網就享受版本控制的好處,并且也意味著普通的提交速度也要快的多,而且,以此帶來的巨大靈活性甚至能改變你的工作方式,因為以前集中式的版本控制系統,每次提交都會影響到他人,以至于不能提交未經測試的版本,而使用分布式的版本控制系統時,你可以隨時隨地的本地提交,安全的保護自己的工作成果,以防意外,也能隨時隨地的本地clone,本地分支,本地就是一套完整的版本控制系統!直到修改到最終版本,然后才push(相當于集中式版本控制的commit)到真正的一個公用庫上去。想到那當年作為一個新員工,每次提交代碼都需要請示總監的日子。。。。那是多么痛苦的啊。。。。
其次,對于個人開發者來說,使用集中式版本控制系統的時候有沒有想過,僅僅是一個人工作,為啥偏要建立一個中心庫,然后每次將自己的代碼提交到那上面去?。孔约罕镜匾粋€副本,庫還得有一個副本,也不環保嘛。呵呵,甚至,我以前還為此專門架設了自己的VSS服務和SVN服務器-_-!而用分布式的版本控制系統就沒有那么麻煩了,本地建庫,直接使用就好了^^只有用過后才知道原來一切都那么簡單。。。。。。。。。。。。。并且,當你哪天想要將工作成果share出去的時候,也不麻煩,還是一條普通的push命令,就像遠方的服務器一直搭建好了一樣。
但是,其實目前來說,分布式的版本控制系統還是有一定缺陷的,比如權限控制的問題,這點可能因為Mercurial的用戶群主要在于開源世界,所以沒有太過重視,實際上對企業開發可能會比較重要,相對來說SVN,特別是VSS就要好的多。但是,事實上通過外部的手段進行權限的控制還是可行的(比如ssh的登錄),只不過相對來說會復雜一點,這也算是個小缺陷了(可大可小)。然后Mercurial相比Git還有個缺點,那就是分支的時候不能對單獨的子目錄進行,一次clone就是一個工程,這樣希望在一個大工程中對一個小項目進行分支,會比較麻煩,這點也算是比較大的缺點了,但是,上述缺點都不是分布式版本控制固有的,僅僅是目前Mercurial的實現的問題,相對來說,分布式和集中式這樣工作方式上的區別才是最主要的,畢竟Mercurial還年輕,希望Mercurial將來的實現會更好^^
2009-08-08: Mercurial 1.3.1 - Release version
其次是可愛的烏龜,不過不叫TortoiseMercurial,而是Tortoisehg(因為Mercurial在命令行的命令是HG,不會有人喜歡Mercurial這樣長的命令吧-_-!),在
http://bitbucket.org/tortoisehg/stable/wiki/download,找到下載地址,最新版是0.8.2 ,此外,此網址還有個中文的注冊表文件zh_CN可以下,下載后直接打開,可以使的右鍵菜單的語言編程中文(但是設置中的語言還是E文,為了統一,建議還是用E文的比較好) (BTW:烏龜真是版本控制之王啊。。。。。。。。。從CVS到SVN到Mercurial到Git是無所不包啊。。。。。。)
要說明的是,Mercurial遵循的是典型的Unix風格,即自己只做命令行功能,圖形界面留給了別人做,所以官方版本僅僅只有命令行功能,TortoiseHg是在Windows下較好的一種,這里向大家推薦一下。實際上安裝完TortoiseHg后,已經包含了完整的官方版本,畢竟,TortoiseHg僅僅是Mercurial的一個GUI前端而已。下載后,安裝的流程就不多說了,無非就是下一步。。。。不會的話也不會想要使用這個軟件了。(安裝后,想使用中文的就再打開上面的中文菜單注冊表文件。) 再然后,就可以在右鍵中看到菜單。
2. Linux
對于官方版本來說,Ubuntu下利用
apt-get install mercurial
就行
Redhat就用yum吧,都有可用版本。不過在我的kubuntu9.04上安裝的是1.01版本,實在太老了。
而TortoiseHg在Linux也可用(事實上,仔細觀察一下Windows版本的TortoiseHg就知道,其實它本質上是個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.
不翻譯了,這里說明一下。。。。。launchpad是出品ubuntu的公司建立的一個源代碼host,上述鏈接上有介紹使用方法,基本上如同普通的程序一樣,通過apt-get獲取key,然后修改apt-get在/etc/apt/下的source.list,添加進新的ppa的源(有3個),然后通過apt-get update更新一下源的信息,就可以直接通過apt-get install tortoisehg來下載了,這時下載的mercurial會是最新的1.3版本,而不是原來的1.01老版了。
我用的是kubuntu,沒有用tortoisehg,因為那樣要安裝一整套的gtk庫,用gnome的人就幸福了^^唉。。。這也是當年選擇了Qt的后遺癥啊。。。。。。。。。。
3. Eclipse
Eclipse由于是Windows,Linux通用的,所謂單獨放在這里了,呵呵,JAVA程序的這個優點還是挺吸引人的,說到這里感嘆一下,JAVA程序員哪能理解學習了CreateProcess然后重新學習fork,execxxx,學習了CreateThread,然后學習pthread_create的痛苦啊。。。。。呵呵,這些都是題外話。另外,eclipse插件的管理,你得首先安裝對應的原始官方版本。。。
4. 檢驗安裝
首先檢驗已經安裝成功,可以查看一下官方的版本
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)
這是自由軟件,具體參見版權條款。這里沒有任何擔保,甚至沒有適合
特定目的的隱含的擔保。
呵呵,在通過ppa那個鏈接安裝了新版后,竟然版權信息是中文的。。。。并且,Mercurial翻譯成了水銀,這點比較讓人吐血。事實上Mercurial表示墨丘利。。。。。也就是希臘神話中的赫爾墨斯(Hermes)。。。。。。
見WIKI的說明:
墨丘利(Mercurius)是羅馬神話中為眾神傳遞信息的使者,相對應于希臘神話的赫耳墨斯(Hermes)。他的形象一般是頭戴一頂插有雙翅的帽子,腳穿飛行鞋,手握魔杖,行走如飛。墨丘利是裘比特和瑪亞的兒子,是醫藥、旅行者、商人和小偷的保護神,西方藥店經常用他的纏繞兩條蛇的手杖作為標志。
此外,由于水星在天上運行的速度很快,所以亦用了他的名字而命名。
怎么說。。。。。。。。。。。我都覺得Matt Mackall原意是指墨丘利吧-_-!又扯遠了。。。。。
說明安裝成功。。。。。。。。。。。。。
四、 簡要使用說明
因為在Windows下和在Linux下使用Mercurial是類似的(命令行嘛,能差別大到哪去),這里以Windows下的使用為例,之所以使用Windows為例而不是用Linux因為我用的是Word2007編輯所以復制結果比較方便,之所以用Word2007是因為拷貝到IE中的CSDN blog編輯框中比較方便,之所以用IE是因為CSDN blog對Firefox的支持不好。。。。。。。。這里抱怨一下-_*!。。。。。
下面的小標題括號中的英文即是對應的Mercurial命令。
1. 幫助(help)
從上面的檢驗安裝方法可以看出來,Mercurial的命令是Hg。
首先,因為我不能將所有的命令都講完,所以先告訴大家怎么用幫助^^,我果然很取巧-_-!
Mercurial有內建的幫助系統,參數是help,help后還可以以需要查詢的命令為參數。
比如:
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. 建庫(init)
上面的幫助內容,懂E文的的就看懂了,init就是Mercurial的建庫命令,使用方法如此簡單。比如我希望在E:\Work\Hello下建立一個我自己的庫,只需要在e:\Work\Hello目錄輸入hg init如下:
E:\work\hello>hg init
E:\work\hello>
事實上,你看不到任何輸出,但是通過dir查看的時候會發現多出的.hg目錄(在Linux因為是“.”開頭,默認是隱藏的),而Windows下沒有這個規矩,所以還是會顯示出來。想起一個笑話,以前有個牛人說,為啥.Net叫.Net?因為在Linux下甚至都不會顯示出來^^
這個時候一個你自己的Mercurial庫就建好了:)
3. 克隆(clone)
事實上,我機器上還是保留了svn,因為我可以很方便的在sourceforge和Google code上下載別人的代碼-_-!用的是svn co命令,事實上,大部分人用的最多的也就是這個命令了^^,在mercurial上將svn和VSS的checkout代碼命令叫做克?。╟lone),事實上也體現了不同的版本控制系統的管理哲學。集中庫嗎,需要的是檢出(checkout)然后遷入(commit),而分布式呢,因為就沒有集中庫的概念,你需要做的是在一個人為指定的集中庫上克隆一份,你自己的庫也就是與服務器上的庫一樣的庫(克隆的概念^^)
首先看下幫助,(這里只貼上了第一行):
E:\work>hg help clone
hg clone [OPTION]... SOURCE [DEST]
即hg clone 源 目標
比如,以后我準備將代碼都放在Google Code上共享,而Google Code對Mercurial原生支持(哈雷路亞),所以,大家可以直接通過clone命令去隨意克隆我的代碼,我的博客sample代碼存放的Mercurial的地址是
那么大家只需要通過如下命令就能下載回去我所有的Sample代碼:(當然,Mercurial要是已經安裝好的,并且在你想要下載的位置執行下列命令(google推薦的用法)
這樣,就將我所有的blog sample代碼全部clone到當前目錄的jtianling-blog-sample-code目錄下了。
如下所示:
E:\work\jtianling-blog-sample-code>dir/w
驅動器 E 中的卷是 文檔
卷的序列號是 940C-1FF8
E:\work\jtianling-blog-sample-code 的目錄
[.] [..] [.hg] [2009-9-25]
0 個文件 0 字節
4 個目錄 3,043,004,416 可用字節
E:\work\jtianling-blog-sample-code>
目前僅僅有在E:\work\jtianling-blog-sample-code\2009-9-25\helloMercurial下添加進去的一個文本,helloMercurial.txt。
好了,僅僅想學會怎么用Mercurial去享用別人代碼的人可以放心的走了,一切很簡單吧:)
4. 本地提交(commit)
Mercurial也有commit,不過這里的commit與VSS,SVN中的不同,這里的commit僅僅提交到本地,所以題目特意強調了一下,是本地的提交,這再一次的體現了命令反應哲學的問題^^。在Mercuria里面,你可以放心的commit,因為不會影響到別人。
比如,剛才我clone回來的文本helloMercurial.txt內容是:
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
這個時候,在Windows下,直接彈出的是默認的文本編輯工具,我這里是記事本,有如下提示信息:
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,沒有的話是會終止提交的,這也體現了一種好的軟件版本管理哲學,每次提交都強制性的要求有說明的,VSS中由于可以忽略說明,所以事實上,我們公司是沒有任何人提交帶說明的,然后呢?碰到問題的時候就靠喊貝,反正在一個公司-_-!這里,我加入一行:
Add a Line to Test commit command
然后保存退出。這時候提交就已經完成了。
5. 記錄(log)
怎么確認提交完成沒有,怎么查看版本歷史,用log命令,執行效果如下:
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>
可以看到我說明的Add a Line to Test commit command版本已經commit了。但是這個時候其實是不影響google上的任何東西的啊:)google上該是啥還是啥。
6. 版本同步(push,pull)
當我真的需要將修改提交到服務器上怎么做呢?用push(推)出去自己的版本:)事實上,這還是牽涉到版本管理哲學的問題,因為google code上host的那個庫在Mercurial看來也就是一個普通的庫,沒有什么特殊的,你僅僅是將自己的庫強行推給它,將它的庫修改而已。同理,當你想要放棄修改,需要做的就是將google code上的庫pull(拉)回來。比如,我想同步修改google code上我的那個文本。
命令及輸出如下:
searching for changes
http authorization required
realm: Google Code Mercurial Repository
user: JTianLing
password:
Success.
當然,在google code上push是需要用戶名和密碼的,完成后顯示Success,然后你再去clone的時候會發現內容已經變了。
這里我們確認一下,通過下面的命令,我們再clone一份放到jtianling-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>
這里,會發現輸出的信息也與第一次看到的不同了,這里已經有兩個changesets了,需要說明的是Mercurial是基于changesets管理的版本控制系統與git基于內容管理(snapshot)管理的方式不同。在Mercurial中,一個系統就是通過一個一個changesets累加起來的。
這里,可以看到新的內容了(按照本文的說明,你下的時候就已經是新的內容了)
五、 小結
事實上Mercurial的命令遠不止這一些,詳細的內容還是那句話,希望大家可以查看教程《Mercurial 使用教程》與《Mercurial: The Definitive Guide》,一篇小文,難以承載那么多東西,呵呵,何況,也沒有必要做太多前人已經做好的工作?!禡ercurial 使用教程》作為入門非常不錯,并且還是中文的,推薦給大家。而且,我說的都是命令行下面的操作,但是,事實上命令行都懂了,圖形操作就更不用說了,主要的是理解這些命令對應的分布式版本控制管理概念就好。
我寫此文的目的其實主要是因為以后會將blog中的sample代碼都放在上述示例的那個工程中,而我會使用Mercurial,為了不需要每次都向大家解釋怎么樣才能用Mercurial clone回代碼,特別寫此文簡單的介紹一下。
六、 參考資料:
需要詳細了解Mercurial的話,這里有幾篇非常好的教程
1. 《Mercurial: The Definitive Guide》,By Bryan O'Sullivan。最好的Mercurial教程,就是篇幅巨大
2. 《A tutorial on using Mercurial》,官方推薦的一個教程E文版
3. 《Mercurial 使用教程》,上面那個教程的中文版,!推薦!
4. 《Mercurial快速入門》,一個中文的快速入門教程,事實上僅僅翻譯了標題-_-!
5. 《Mercurial manual 》,作者就是Mercurial的作者。
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie
發表于 @ 2009年09月25日 13:05:00 | 評論( 5 ) | 編輯| 舉報| 收藏