在Google Code上用 Mercurial 取代 Subversion 管理你的項目

在Google Code上用 Mercurial 取代 Subversion 管理你的項目
之前,我一直都是用的SVN作為我日常的版本控制工具,諸如代碼啊文檔啊之類的東西。至於CVS這麼復古的版本控制工具更是沒有機會去嘗試。說到SVN控制版本的話,作為託管服務商比較好的就有google code,本人也一直在使用。最近,由於一些項目的原因,了解到了另外一個版本控制工具Hg,當然Hg不是它的原名,原名叫Mercurial,都是水銀的意思,所以通常稱呼為Hg。

與集中式版本控制工具SVN不同的是,Hg是一種分散式版本控制工具。除了Hg,還有大名鼎鼎的Git也是分散式版本控制工具。想要更具體的了解版本控制工具的,推薦閱讀胡凱《為什麼我們要放棄Subversion》,
風雲《分 布式的版本控制工具》,猛禽《分 布式版本控制(一)》 《分 布式版本控制(二) 》,Sparkle《我 與Mercurial 系列等幾篇文章》等。只是想了解Mercurial(Hg)的話,Mercurial官方wiki已經有很詳盡的資料和幫助文檔了。

接下來回到本文的正題。本文的起因是Google Code在早前除了支持SVN託管代碼外,更支持了分散式版本控制Mercurial(Hg)來管理你託管在Google Code上的項目。至於Google為什麼在這麼多種的分散式版本控制工具中選擇了Mercurial而不是Git,這裡有一篇文章,推薦閱讀一下《Git 與 Mercurial 的分析》,原文《Analysis of Git and Mercurial》

下面,就教大家怎麼讓Google Code用Mercurial替代Subversion來管理你的項目。原文 http://code.google.com/p/support/wiki/ConvertingSvnToHg。

在Google Code里設置由Mercurial來管理項目

  1. 訪問你已經存在的google code項目頁面,選擇 「Administer」 選項頁,然後選擇下級分類選項頁 「Source」。
  2. 改變第一項Repository type為Mercurial。
  3. 參照下文介紹的「如何轉換Google Code里Subversion的歷史記錄到Mercurial中」,導入你的代碼到 Hg 代碼庫中
  4. 以同樣的導入代碼的方式,導入你的wiki到Hg wiki庫中。確認你使用的subversion代碼庫的wiki路徑(例如 http://projectname.googlecode.com/svn/wiki) 以及 Hg 代碼庫的wiki路徑(http://wiki.projectname.googlecode.com/hg/)

在你切換你的項目使用Mercurial管理後,你的舊Subversion項目仍然可以訪問,所以在你切換之前你不需要備份你的代碼庫。你的Subversion版本庫將會保持訪問: https://projectname.googlecode.com/svn/

如何轉換Google Code里Subversion的歷史記錄到Mercurial中

第一種方式:簡要截取
如果你不在乎你原來項目的歷史記錄,那麼你可以簡單地從Subversion里的主幹代碼或者wiki中提取最新的代碼然後放到你的Mercurial中。假設你googlecode里的 Mercurial代碼庫是空的,那麼可以這樣操作:

 $ hg clone https://projectname.googlecode.com/hg hg-client
 $ cd hg-client
 $ svn export --force http://projectname.googlecode.com/svn/trunk .
 $ hg add .
 $ hg commit -m "Initial import of source."
 $ hg push

接著轉換你的wiki:

 $ hg clone https://wiki.projectname.googlecode.com/hg hg-client-wiki
 $ cd hg-client-wiki
 $ svn export --force http://projectname.googlecode.com/svn/wiki .
 $ hg add .
 $ hg commit -m "Initial import of wiki."
 $ hg push

第二種方式:完整歷史記錄轉換
如果你要遷移你整個的歷史記錄,整個過程可能要你更多的參與了。你將會需要先安裝一些特殊的工具程序。
安裝工具

  • ‘hg convert’擴展模塊。最新版本的Mercurial已經包含這個模塊,請確保你的hg版本為1.1 或者 1.2 或者更高版本。 (可用”hg –version”命令查看) 然後在你的.hgrc裡面添加如下代碼啟用該擴展模塊:
    [extensions]
    hgext.convert=
  • Subversion的swig-python綁定。請確保您有最近的Subversion安裝(1.5或1.6)。絕大部分的Subversion衍生版本都有與python的綁定,或者提供他們額外的二進位包。你可以運行如下代碼檢查你的svn – python的綁定是否正常:
    $ python -c "import svn.core; print svn.core.SVN_VER_MINOR"
            5

    如果失敗,或返回的版本低於5,則肯定是不對的。如果你沒有二進位軟體包,你可以從Subversion自己的源代碼樹中建立:

    $ svn checkout http://svn.collab.net/repos/svn/tags/1.6.0 svn
    $ cd svn
    $ ./autogen.sh && ./configure
    $ make
    $ sudo make install
    $ make swig-py  # make sure you have swig 1.3 installed already
    $ make check-swig-py
    $ sudo make install-swig-py

    如果你在Ubuntu的Hardy版本,你可以在hardy-backports里找到1.5版的python-subversion: http://packages.ubuntu.com/hardy-backports/python-subversion
    這可能還需要安裝backports里的libsvn1, subversion, mercurial-common, 和mercurial 包。

開始轉換
現在我們開始轉換– branches(分支), tags(標籤)以及其他全部:

$ mkdir hg-client
$ hg convert http://projectname.googlecode.com/svn hg-client

一旦完成轉換,你就可以push你最新的歷史記錄到你的Google Code項目中(前提是你有了一個空的Mercurial版本庫):

$ cd hg-client
$ hg push https://projectname.googlecode.com/hg

至此,大功告成。