首页 > 代码库 > 对svn版本库磁盘空间瘦身
对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版本库磁盘空间瘦身