svn遷移

svn:subversion的簡稱,是一種開放源代碼的版本控制系統,相較於RCS,CVS,它採用了分支管理系統,他設計目標就是取代CVS。

運行方式

svn服務器有2種運行方式:獨立服務器和藉助apache運行。兩種方式各有利弊,用戶可以自行選擇。


關閉所有運行的進程,並確認沒有程序在訪問存儲庫(如 httpd、svnserve 或本地用戶在直接訪問)。
備份svn存儲庫
#壓縮備份
svnadmin dump /home/workhome/svn/repository | gzip > ~/repository-backup.gz
#不壓縮備份
svnadmin dump /home/workhome/svn/repository > ~/repository-backup.svn

恢復svn存儲庫
#建立新的svn存儲庫
svnadmin create /home/workhome/svn/newrepository
#確認成功與否
ls -l /home/workhome/svn/newrepository
#導入存儲庫數據
svnadmin load /home/workhome/svn/newrepository < ~/repository-backup.svn



SVN數據庫遷移方法一

稱之爲SVN全庫操作,或稱SVN全局備份並恢復,版本庫數據的移植:svnadmin dump、svnadmin load
導出:
$svnadmin dump repos > dumpfile //將指定的版本庫導出成文件dumpfile
新建:
$svnadmin create newrepos
導入:
$svnadmin load newrepos < dumpfile

 SVN數據庫遷移方法二
增量備份或批次備份,批次恢復,特定reversion導出:
$svnadmin dump repos –r 23 >rev-23.dumpfile //將version23導出
$svnadmin dump repos –r 100:200 >rev-100-200.dumpfile //將version100~200導出

批次導出:對比較大的庫可以批次導出,便於備份
$svnadmin dump repos –r 0:1000 >0-1000.dumpfile
$svnadmin dump repos –r 1001:2000 --incremental >1001-2000.dumpfile
$svnadmin dump repos –r 2001:3000 --incremental >2001:3000.dumpfile

批次導入,將這幾個備份文件裝載到一個新的版本庫中
$svnadmin load newrepos < 0-1000.dumpfile
$svnadmin load newrepos < 1001-2000.dumpfile
$svnadmin load newrepos < 2001:3000.dumpfile

SVN數據庫遷移方法三
導出後,在導入時對庫做分庫整理或其它整理操作過濾版本庫歷史:
假設有一個包含三個項目的版本庫: calc,calendar,和 spreadsheet。它們在版本庫中的佈局如下:
/
 calc/
 trunk/
 branches/
 tags/
 calendar/
 trunk/
 branches/
 tags/
 spreadsheet/
 trunk/
 branches/
 tags/
現在要把這三個項目轉移到三個獨立的版本庫中。首先,轉儲整個版本庫:
$ svnadmin dump /path/to/repos > repos-dumpfile
* Dumped revision 0.
 * Dumped revision 1.
 * Dumped revision 2.
* Dumped revision 3.
  然後,將轉儲文件三次送入過濾器,每次僅保留一個頂級目錄,就可以得到三個轉儲文件:
$ cat repos-dumpfile | svndumpfilter include calc > calc-dumpfile
$ cat repos-dumpfile | svndumpfilter include calendar > cal-dumpfile
$ cat repos-dumpfile | svndumpfilter include spreadsheet > ss-dumpfile

現在你必須要作出一個決定了。這三個轉儲文件中,每個都可以用來創建一個可用的版本庫,不 過它們保留了原版本庫的精確路徑結構。也就是說,雖然項目calc現在獨佔了一個版本庫,但版本庫中還保留着名爲calc的頂級目錄。如果希望 trunk、tags和branches這三個目錄直接位於版本庫的根路徑下,你可能需要編輯轉儲文件,調整Node-path和Copyfrom- path頭參數,將路徑calc/刪除。同時,你還要刪除轉儲數據中創建calc目錄的部分。一般來說,就是如下的一些內容:
 Node-path: calc
 Node-action: add
 Node-kind: dir
 Content-length: 0
 警告:
如果你打算通過手工編輯轉儲文件來移除一個頂級目錄,注意不要讓你的編輯器將換行符轉換爲本地格式(比如將\r\n轉換爲\n)。否則文件的內容就與所需的格式不相符,這個轉儲文件也就失效了。
剩下的工作就是創建三個新的版本庫,然後將三個轉儲文件分別導入:
$ svnadmin create calc; svnadmin load calc < calc-dumpfile
$ svnadmin create calendar; svnadmin load calendar < cal-dumpfile
$ svnadmin create spreadsheet; svnadmin load spreadsheet < ss-dumpfile

svndumpfilter的兩個子命令都可以通過選項設定如何處理“空”修訂版本。如果 某個指定的修訂版本僅包含路徑的更改,過濾器就會將它刪除,因爲當前爲空的修訂版本通常是無用的甚至是讓人討厭的。爲了讓用戶有選擇的處理這些修訂版 本,svndumpfilter提供了以下命令行選項:
--drop-empty-revs
不生成任何空修訂版本,忽略它們。
--renumber-revs
如果空修訂版本被剔除(通過使用--drop-empty-revs選項),依次修改其它修訂版本的編號,確保編號序列是連續的。
--preserve-revprops
如果空修訂版本被保留,保持這些空修訂版本的屬性(日誌信息,作者,日期,自定義屬性,等等)。如果不設定這個選項,空修訂版本將僅保留初始時間戳,以及一個自動生成的日誌信息,表明此修訂版本由svndumpfilter處理過。
儘管svndumpfilter十分有用,能節省大量的時間,但它卻是把不折不扣的雙刃劍。首先,這個工具對路徑語義極爲敏感。仔細檢查轉儲文件中的路徑是不是以斜線開頭。也許Node-path和Copyfrom-path這兩個頭參數對你有些幫助。
Node-path: spreadsheet/Makefile
如果這些路徑以斜線開頭,那麼你傳遞給svndumpfilter include和svndumpfilter exclude的路徑也必須以斜線開頭(反之亦然)。如果因爲某些原因轉儲文件中的路徑沒有統一使用或不使用斜線開頭,也許需要修正這些路徑,統一使用斜 線開頭或不使用斜線開頭。
此外,複製操作生成的路徑也會帶來麻煩。Subversion支持在版本庫中進行復制操 作,也就是複製一個存在的路徑,生成一個新的路徑。問題是,svndumpfilter保留的某個文件或目錄可能是由某個svndumpfilter排除 的文件或目錄複製而來的。也就是說,爲了確保轉儲數據的完整性,svndumpfilter需要切斷這些複製自被排除路徑的文件與源文件的關係,還要將這 些文件的內容以新建的方式添加到轉儲數據中。但是由於Subversion版本庫轉儲文件格式中僅包含了修訂版本的更改信息,因此源文件的內容基本上無法 獲得。如果你不能確定版本庫中是否存在類似的情況,最好重新考慮一下到底保留/排除哪些路徑。
備份環境注意點
 1、確保沒有其他進程訪問版本庫,關閉apache、svnserve服務
 2、成爲版本庫的管理員,如果以其他身份還原版本庫,可能會改變版本庫文件的訪問權限,導致在恢復後依舊無法訪問
 3、svnadmin recover /path/to/repos
 4、重新啓動服務進程

SVN數據庫整理方法
不經過dump,load操作,實現SVN數據庫整理操作,先設計好調整後的目錄, 然後打開版本庫, 選中要調整或轉移的文件(文件夾)-->右鍵拖住,不要鬆手-->然後將要轉移的文件(文件夾)拖至目標文件夾-->鬆手--> 選擇move items to here-->完成

每經過這樣的調整,大家都會擔心歷史記錄是否還會存在, TortoiseSVN在默認情況下, 是不會顯示出來的,需要將一個選項去除.

如此可實現基於庫的調整操作,但事事不是盡如人意的,這樣的一次操作下來,revision會增長好多。
我的想法是:
停止當前SVN服務,將當前的SVN庫直接進行整理,就像整理存儲在電腦中的文件夾一樣, 然後開啓SVN服務,即時顯示調整後的效果,哈哈..是不是有點異想天開,其實我也覺得這是不太可能的,除非使用工具訪問,否則SVN庫不是顯示可見的, 希望以後啥配置管理工具可以讓管理員有這樣的權限.

 
實驗:
一、在遷出服務器執行:
svn@Africa:~/csvn/bin> csvn stop
Stopping CSVN Console...
Waiting for CSVN Console to exit...
Waiting for CSVN Console to exit...
Stopped CSVN Console.
svn@Africa:~/csvn/bin> csvn-httpd stop
Stopping Subversion Edge Apache Server:                                                                                   done
svn@Africa:~/csvn/data/repositories> svnadmin dump /home/svn/csvn/data/repositories/camp | gzip >camp_dumpfile_20130610.gz
......
* Dumped revision 4495.
* Dumped revision 4496.
svn@Africa:~/csvn/data/repositories> ls
camp  camp_dumpfile_20130610.gz  cpst  csvn  csvn-httpd  docm

二、在遷入服務器執行:
取遷出服務器上導出的文件camp_dumpfile_20130610.gz;
csvn@campostdev:~/data/repositories> svnadmin create /home/csvn/data/repositories/newcamp
csvn@campostdev:~/data/repositories> gzip -d camp_dumpfile_20130610.gz
csvn@campostdev:~/data/repositories> svnadmin load /home/csvn/data/repositories/newcamp < camp_dumpfile_20130610
......
<<< Started new transaction, based on original revision 4495
     * editing path : trunk/site/campost/src/dsp/frmDomItemMod.mcpp ... done.
     * editing path : trunk/site/campost/src/dsp/frmIntItemMod.mcpp ... done.
------- Committed revision 4495 >>>
<<< Started new transaction, based on original revision 4496
     * editing path : trunk/site/campost/src/dsp/frmDspInterCloseDisp.mcpp ... done.
------- Committed revision 4496 >>>
csvn@campostdev:~/bin> csvn start
Starting CSVN Console......
CSVN Console started
Waiting for application to initialize (this may take a minute)...............................................
CSVN Console is ready at http://localhost:3343/csvn
csvn@campostdev:~/bin> csvn-httpd start
Starting Subversion Edge Apache Server:            



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章