posts - 262,  comments - 221,  trackbacks - 0

           【1.業(yè)務(wù)需求】


          經(jīng)過前面的SVN搭建,權(quán)限配置和強(qiáng)制寫日志的工作之后,今天的任務(wù)是把原來其它分散的各個(gè)版本庫統(tǒng)一遷移到新的版本庫,集中統(tǒng)一管理。要求不改變原有的版本庫的內(nèi)容和版本號(hào)。

          【2.基本思路】
          要實(shí)現(xiàn)版本庫的無縫遷移,必須通過以下3個(gè)步驟:
           ①導(dǎo)出舊的版本庫
           ②導(dǎo)入新的版本庫
           ③通知客戶端切換版本庫分支

          首先來看第一步:導(dǎo)出舊的版本庫。我們知道SVN提供了check out命令和export命令簽出,導(dǎo)出版本庫中的內(nèi)容。對于版本庫內(nèi)容比較少的情況這種方法可以采用。但是如果版本庫中內(nèi)容比較多,那么這種方法就顯得很笨重了,而且還涉及到版本號(hào)改變的問題。所以首先擯棄這種做法。

          我們知道Oracle提供了export/import命令來將數(shù)據(jù)庫導(dǎo)出成一個(gè)二進(jìn)制文件,然后導(dǎo)入。同樣的SVN也提供了一對命令:dump和load。不同的是這兩個(gè)命令導(dǎo)出的是文本內(nèi)容(肉眼可以讀懂)。而且還有一次性導(dǎo)出和增量導(dǎo)出,單版本導(dǎo)出與多版本導(dǎo)出等多種選擇操作,就是這個(gè)了。

          其次我們來看“通知客戶端切換版本庫分支”。在我們完成服務(wù)器端的版本遷移之后,必須通知客戶端運(yùn)行切換分支的命令,否則客戶端的提交還是提交到舊的版本庫去。SVN也為我們準(zhǔn)備了這樣的命令:svn switch。

          【3.相關(guān)命令】
          首先我們來看一下SVN的dump和load命令

          ①svnadmin dump命令語法
          svnadmin dump REPOS_PATH [-r LOWER[:UPPER][--incremental]

          svnadmin dump命令用于導(dǎo)出整個(gè)Repository或Repository下的某個(gè)范圍的修訂版本。REPOS_PATH是版本庫的路徑,[-r LOWER[:UPPER]]用于指定導(dǎo)出的修訂版本范圍,由參數(shù)-r和兩個(gè)用:號(hào)隔開阿拉伯?dāng)?shù)字組成。例如:-r 0:50表示導(dǎo)出才版本0到版本50之間的所有修訂版,-r是revision的縮寫。

          而另一個(gè)關(guān)鍵參數(shù)是--incremental。它使用增量方式來導(dǎo)出版本,即每次都只導(dǎo)出自上一個(gè)版本以來的修改。這樣的好處是第一:可以把一個(gè)大的文件切分成若干個(gè)小的文件。第二:在版本庫已經(jīng)存在的情況下,我們只需要每次導(dǎo)出修改的部分,不需要每次都導(dǎo)出整個(gè)版本庫的內(nèi)容。甚至可以通過hook腳本每天晚上自動(dòng)將當(dāng)天的修改dump出來做備份用。

          ②svnadmin load命令語法
          svnadmin load REPOS_PATH

          svnadmin load命令用于從標(biāo)準(zhǔn)輸入流/其它流中導(dǎo)入版本庫,REPOS_PATH是要導(dǎo)入的目標(biāo)版本庫。

          ③dump和load的輸出/入重定向
          svnadmin dump myrepos > dumpfile

          svnadmin load newrepos < dumpfile

          默認(rèn)情況下dump和load命令分別輸出到默認(rèn)輸出設(shè)備(屏幕)和從默認(rèn)輸入設(shè)備(鍵盤)導(dǎo)入。但我們也可以把輸出流/輸入流重定向。例如上面的第一個(gè)命令,使用重定向符>把屏幕的輸出定向當(dāng)前目錄下的dumpfile,而第二個(gè)命令從當(dāng)前目錄下的dumpfile文件導(dǎo)入。

          上面的命令使用起來已經(jīng)很方便了,那么還有沒有更加方便的用法呢?當(dāng)然有!就是使用管道命令把兩個(gè)命令合二為一。
          svnadmin dump myrepos | svnadmin load newrepos

          ④svn switch命令語法
          svn switch URL [PATH]
          switch --relocate FROM TO 
          [PATH]
          svn switch命令用于更新工作副本的URL。意即指向新的版本庫位置。首先要注意的一點(diǎn)是我們即可以將整個(gè)工作副本指向新的URL,也可將工作副本下的某個(gè)目錄指向新的URL。

          另外一個(gè)重要的參數(shù)就是--relocate。這個(gè)參數(shù)是否使用對于結(jié)果如何有很大影響,使用不當(dāng)甚至可能會(huì)造成版本庫不可用。其中有兩條重要的規(guī)則:
           A.假如工作副本只是映射到同一個(gè)版本庫內(nèi)的不同位置,那么使用svn switch即可
           B.假如工作副本已是映射到不同的版本庫,那么必須使用svn switch --relocate

          上面第二條規(guī)則通常發(fā)生在我們需要將整個(gè)版本庫遷移到另外一臺(tái)機(jī),或者同一臺(tái)機(jī)的不同版本庫時(shí)。這個(gè)時(shí)候使用--relocate會(huì)刷新原有工作副本中每個(gè)文件的URL頭部。

          【4.示例操作】
          好了,下面我們來看如何執(zhí)行版本庫的遷移工作。

          ①查看當(dāng)前舊版本庫最新的版本號(hào)是多少
          C:\peng\Other>svnlook youngest newRepo
          161

          ②分批增量導(dǎo)出版本庫內(nèi)容
          C:\peng\Other>svnadmin dump newRepo -r 0:50 > dumpfile1
          * Dumped revision 0.
          * Dumped revision 
          1.
          * Dumped revision 
          2.
          * Dumped revision 
          3.
          導(dǎo)出第一個(gè)文件,版本號(hào)從0到50的修訂版本

          C:\peng\Other>svnadmin dump newRepo -r 51:100 --incremental > dumpfile2
          * Dumped revision 51.
          * Dumped revision 
          52.
          * Dumped revision 
          53.
          * Dumped revision 
          54.
          * Dumped revision 
          55.
          導(dǎo)出第二個(gè)文件,版本號(hào)從51到100的修訂版本

          C:\peng\Other>svnadmin dump newRepo -r 101:161 --incremental > dumpfile3
          * Dumped revision 101.
          * Dumped revision 
          102.
          * Dumped revision 
          103.
          * Dumped revision 
          104.
          * Dumped revision 
          105.

          請注意我們上面三個(gè)命令中第2,3個(gè)命令多了一個(gè)--incremental的參數(shù),這就是采用了增量的方式導(dǎo)出,下面我們一次按照順序?qū)?br />
          ③分批導(dǎo)入版本庫文件

          C:\peng\Other>svnadmin load newRepo2 < dumpfile1
          <<< 開始新的事務(wù),基于最初的修訂版 
          1
               * 正在添加路徑:a  done.

          ------- 提交后的修訂版 
          1 >>>

          <<< 開始新的事務(wù),基于最初的修訂版 
          2
               * 正在刪除路徑:a  done.
          首先導(dǎo)入dumpfile1,然后是dumpfile2,dumpfile3

          C:\peng\Other>svnadmin load newRepo2 < dumpfile2
          <<< 開始新的事務(wù),基于最初的修訂版 
          50
               * 正在添加路徑:branches  done.

          ------- 提交新修訂版 
          12 (從原始修訂版 50 裝載) >>>

          <<< 開始新的事務(wù),基于最初的修訂版 
          51
               * 正在刪除路徑:branches  done.

          ------- 提交新修訂版 
          13 (從原始修訂版 51 裝載) >>>
          導(dǎo)入文件dumpfile2。依次類推dumpfile3。

          如果我們前面不使用--incremental方式導(dǎo)出,此處分批導(dǎo)入三個(gè)dump文件,則會(huì)提示錯(cuò)誤:版本庫文件已經(jīng)存在。

          ④客戶端切換工作副本URL
          C:\peng\Other>svnserve -d -r c:\peng\other

          首先我們把SVN服務(wù)的根目錄指向c:\peng\other目錄,在這個(gè)目錄下有兩個(gè)repository,其中一個(gè)名為newRepo,另外一個(gè)名為呢wRepo2。
          C:\peng\Other>dir
           Volume in drive C is ESOE_W2K
           Volume Serial Number is BC1B-
          22E6

           Directory of C:\peng\Other

          2008-12-26  15:10       <DIR>          .
          2008-12-26  15:10       <DIR>          ..
          2008-12-23  10:04       <DIR>          Backup
          2008-12-26  14:21               45,578 dumpfile1
          2008-12-26  14:22               39,567 dumpfile2
          2008-12-26  14:23               55,740 dumpfile3
          2008-12-15  09:08       <DIR>          newRepo
          2008-12-26  14:20       <DIR>          newRepo2
          2008-12-26  15:25       <DIR>          ps
          2008-12-24  15:11       <DIR>          Toolbar
                         
          3 File(s)        140,885 bytes
                         
          7 Dir(s)   2,668,414,976 bytes free

          C:\peng\Other>

          首先我們從newRepo這個(gè)版本庫中check out出一個(gè)子目錄ps
          C:\Documents and Settings\qlinpen.E0015609D6309>svn checkout svn://localhost/newRepo/ps c:/peng/other/ps
          A    C:\peng\Other\ps\ps.txt
          取出修訂版 
          170

          現(xiàn)在該工作副本已經(jīng)和:svn://localhost/newRepo/ps發(fā)生了映射關(guān)系。我們可以使用svnlook info來顯示這個(gè)工作副本的一般信息
          C:\peng\Other>cd ps

          C:\peng\Other\ps>svn info
          路徑:.
          地址(URL):svn://localhost/newRepo/ps
          Repository Root: svn://localhost/newRepo
          檔案庫 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078
          修訂版:
          170
          節(jié)點(diǎn)種類:目錄
          調(diào)度:正常
          最后修改的作者:admin
          最后修改的修訂版:
          170
          最后修改的時(shí)間: 
          2008-12-26 14:52:32 +0800 (星期五, 26 十二月 2008)

          輸出信息中明確地指出ps目錄指向了svn://localhost/newRepo/ps。下面我們來把它指向另一個(gè)repository下的同名位置:svn://localhost/newRepo2/ps。
          C:\peng\Other\ps>svn switch --relocate svn://localhost/newRepo/ps svn://localhost/newRepo2/ps

          C:\peng\Other\ps>

          經(jīng)過上面的切換后,再次使用svnlook info輸出一般信息,發(fā)現(xiàn)URL已經(jīng)被成功切換過來了
          C:\peng\Other\ps>svn info
          路徑:.
          地址(URL):svn://localhost/newRepo2/ps
          Repository Root: svn://localhost/newRepo2
          檔案庫 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078
          修訂版:
          170
          節(jié)點(diǎn)種類:目錄
          調(diào)度:正常
          最后修改的作者:admin
          最后修改的修訂版:
          170
          最后修改的時(shí)間: 
          2008-12-26 14:52:32 +0800 (星期五, 26 十二月 2008)

          我們嘗試著在ps目錄下修改文件ps.txt為ps.doc,然后提交看看會(huì)提交到那個(gè)repos去?
          C:\peng\Other\ps>svn list svn://localhost/newRepo/ps
          ps.txt

          C:\peng\Other\ps>svn list svn://localhost/newRepo2/ps
          ps.doc

          C:\peng\Other\ps>

          很明顯現(xiàn)在的提交全部都去到新的位置了!切換成功。

          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-12-26 11:52 Paul Lin 閱讀(4129) 評論(1)  編輯  收藏 所屬分類: 項(xiàng)目管理


          FeedBack:
          # re: 【版本控制之類】SVN版本庫的遷移
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點(diǎn)博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 安泽县| 怀来县| 钟山县| 阿克陶县| 南陵县| 六安市| 宁明县| 长阳| 会理县| 玛多县| 法库县| 桦甸市| 招远市| 福建省| 普安县| 永川市| 汕尾市| 浏阳市| 五莲县| 甘南县| 秦皇岛市| 灵丘县| 民乐县| 海阳市| 永济市| 威信县| 宝清县| 贡觉县| 东港市| 岑巩县| 青冈县| 扎囊县| 屯留县| 会昌县| 拉孜县| 同仁县| 新民市| 东乡县| 高密市| 宜春市| 武平县|