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