標籤:svn
問題原因:
平常自己寫的測試專案都放在自己電腦上的一個svn版本庫裡,有些資料放進去後來又刪掉了,但是svn版本庫是不會減少的,
如果放進去了一個200M的項目,版本曆史是 50, 這時候可去看下svn庫,下的 db/revs/0/50 這個檔案,將永久存在這個svn庫中,
如果這個項目將來想還原出來,這個功能倒是有用,如果是永久放棄,就需要 對svn庫進行下瘦身了
一. 匯出整個版本庫
svnadmin dump F:/SVN/test > F:/SVN/dump
我的版本庫跟路徑是F:/SVN/test ,
這樣整個test庫匯出到 F:/SVN檔案夾下的dump檔案
(或者匯出時就給版本庫瘦下身,使用-r參數指定版本記錄從60到99 進行匯出
svnadmin dump F:/SVN/test -r 60:99 > F:/SVN/dump)
二.過濾dump檔案
svndumpfilter include /trunk/project1 <dump> dump_project1 --drop-all-empty-revs
這個命令時過濾dump檔案中/trunk/project1檔案下的所有檔案到dump_project1檔案中,
svndumpfilter exclude /trunk/project1 <dump> dump_project1 --drop-all-empty-revs
這個命令時過濾dump檔案中/trunk/project1檔案下的所有檔案 除去,剩餘的檔案資訊放到dump_project1 檔案中
如果有多重專案,可以直接在 /trunk/project1後加個空格,接著寫項目路徑.eg: /trunk/project1 /trunk/project2
下面是過濾時能用的所有參數:
--drop-empty-revs : Remove revisions emptied by filtering.
--drop-all-empty-revs : Remove all empty revisions found in dumpstreamexcept revision 0.
--renumber-revs : Renumber revisions left after filtering.
--skip-missing-merge-sources : Skip missing merge sources.
--targets ARG : Read additional prefixes, one per line, fromfile ARG.
--preserve-revprops : Don‘t filter revision properties.
--quiet : Do not display filtering statistics.
--pattern : Treat the path prefixes as file glob patterns.
一般就使用--drop-all-empty-revs 把原來的編號給刪掉,從新排列. 把過濾掉的檔案的曆史資訊給扔掉
--renumber-revs這個是曆史資訊扔掉,但不重新排列序號
--preserve-revprops這個是保留所有的老版本資訊,包含過濾掉檔案資訊
三.建立svn庫並匯入過濾號的資料
svnadmin create test2
svn mkdir file:///F:/svn/test2/trunk --parents -F F:/svn/log.txt (這是在建立的svn庫中添加一個trunk目錄,否則下一步會報錯,所有的過濾目錄的上級目錄都要自己手動建好)
svnadmin load F:/svn/test2 < dump_project1
完整的一個批次檔:
svnadmin dump F:/SVN/test > F:/SVN/dump
svndumpfilter include /trunk/project1 <dump> dump_project1 --drop-all-empty-revs
if exist test2 (
rd /s/q test2
svnadmin create test2
svn mkdir file:///F:/svn/testTemp/test2/trunk/ --parents -F F:/svn/log.txt
) else (
svnadmin create test
svn mkdir file:///F:/svn/testTemp/test2/trunk/ --parents -F F:/svn/log.txt
)
svnadmin load F:/svn/testTemp/test2 < dump_project1
一個謹慎的操作:
如果過濾一個這樣的 /trunk/first/second/third/project1項目,然後把project1移動到/trunk下.
結果:
/trunk/project1
這種操作往後將不能再對project1下的檔案瘦身,排除一些檔案了,這個時候project1下的檔案指向路徑還是/trunk/first/second/third/project1項目老的物理磁碟檔案.svn上的路徑換了,而磁碟檔案沒變,而老的svn路徑/trunk/first/second/third/project1將變為一個invalid path
當再次對這種庫匯出檔案過濾的時候會報錯.eg:過濾 /trunk/project1/docs
svndumpfilter include /trunk/project1/docs <dump> dump_project1_docs --drop-all-empty-revs
當把docs下檔案過濾到 dump_project1_docs 時,還是用的/trunk/first/second/third/project1這個路徑copy過去.
然後報出/trunk/first/second/third/project1 路徑 無效.
所以所以 瘦個身,就瘦個磁碟空間就可以了,不要把路徑也給瘦了.路徑一瘦往後別想再瘦磁碟空間了
http://svnbook.red-bean.com/en/1.7/svn.ref.svndumpfilter.html#svn.ref.svndumpfilter
對svn版本庫磁碟空間瘦身