問題原因:
平常自己寫的測試項目都放在自己電腦上的一個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