前言
SVN占用的空间随着项目版本迭代越来越大,因为保存了历史记录中的各个版本,所以即使本地把废弃的目录删掉提交,也不会释放出多余的空间,大概率因为操作删除增加了一个版本号,使得占用的空间更大了。
怎么才能让它的空间变小的,最简单粗暴的方式就是丢弃历史记录,在最新的版本中剔除的废弃的目录直接上传创建一个新的仓库,这样操作后所有的人需要重新下载才行,如果想保留历史记录,就要用到今天说的这种备份、过滤、再导入的方式了。
简要步骤
假设svn库A在服务器上的路径是:/data/svndata/repos/A
,需要删除的文件路径为 /arts/tmp/pictures
,注意要过滤的文件夹路径以 /
开头,其实代指起始目录 A
。
操作的步骤如下:
1 | //1.备份 |
操作示例
操作过程使用的是一个真实的SVN仓库,就是按照上面的步骤试了一次,主要想看下是不是传说中的那么耗时,仓库名为R,数据量115G,共10843个版本。
导出备份文件
1
2
3
4
5# svnadmin dump/data/svndata/repos/R > r.dump
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
...完整导出用了2小时40分钟,导出文件大小为514G,数据量翻了近5倍。
过滤掉指定目录
1
2
3
4
5
6
7
8
9
10# cat r.dump | svndumpfilter exclude /arts/tmp/pictures > r-exclude.dump
Excluding prefixes:
'/arts/tmp/pictures'
Revision 0 committed as 0.
Revision 1 committed as 1.
Revision 2 committed as 2.
Revision 3 committed as 3.
Revision 4 committed as 4.
...将/arts/tmp/pictures目录过滤掉,总共用时58分钟,过滤后的备份文件大小442G
创建新的临时仓库
1
# svnadmin create r-new
将过滤后的备份文件导入新库
1
2
3
4
5
6
7
8
9
10
11
12
13# svnadmin load ./r-new < r-exclude.dump
<<< Started new transaction, based on original revision 1
* editing path : arts ... done.
* editing path : develop ... done.
------- Committed revision 1 >>>
<<< Started new transaction, based on original revision 2
* editing path : develop/client ... done.
* editing path : develop/server ... done.
------- Committed revision 2 >>>
...导入工作从第一个版本依次应用,总共用时4小时。
这个过程真的是很慢,完整用时近8小时,并且对磁盘空间要求很大,另外还有个接近1万个版本号大小为800G的库,在24核机器上仅导出就花了41小时,备份文件大小4.5T,后面我就没试了,磁盘快满了。
总结
- 备份
svnadmin dump /data/svndata/repos/A > A.dump
- 过滤
cat A.dump | svndumpfilter exclude /arts/tmp/pictures > B.dump
- 建新
svnadmin create /data/svndata/repos/B
- 导入
svnadmin load /data/svndata/repos/B < B.dump
朝气蓬勃的孩子真的可爱,可是我还是想长大,这样才有机会掌控节奏,虽然现在看起来像个提线木偶,但正在尝试突破束缚~
2023-4-21 21:56:28