假设 SVN 设置由带有嵌套项目文件夹的单个 repo 组成,如下所示:
\
- trunk
- - projectA
- - - trunk
- - - - ...
- - - branches
- - - - ...
- - projectB
- - - trunk
- - - - ...
- - - branches
- - - - ...
- ...
整个存储库占用磁盘空间约为 40GB,上次统计有 17605 次提交。我现在需要从存储库中提取单个项目,以便在单独的 SVN 服务器上进行设置,据我所知,这只能通过svnadmin dump
在整个存储库上使用,然后使用它svndumpfilter
来隔离我需要的项目来实现。我完全预料到这将需要很长时间才能完成初始转储。是否有一个好的公式可以准确计算需要多长时间以及最终转储文件需要多少磁盘空间?另外,我听说转储操作在运行时占用 100% 的 CPU。这是真的吗?
或者,考虑到仓库的大小,有没有更好的方法来解决这个问题?(除了仅仅进行导出并丢失修订历史记录。)
答案1
是否有一个好的公式可以准确计算需要多长时间以及最终的转储文件需要多少磁盘空间?
为了避免磁盘 I/O,您可以将svndumpfilter
结果传输到netcat
。
在旧的 SVN 服务器上:
svnadmin dump /path/to/your/repo/ | svndumpfilter --drop-empty-revs --renumber-revs include single_project | nc -l 2302
在新的 SVN 服务器上:
svnadmin create single_project
nc IP_address 2302 | svnadmin load single_project
我已经用我的 repo(4GB,~12000 个修订版)进行了测试,它需要大约 12 分钟才能完成。
PS:您还可以使用gzip
它来压缩数据并ionice
以低优先级运行。
答案2
如果没有这个选项的话,文件会非常大--deltas
,而你在过滤时无法使用这个选项。当然,所需的时间和空间取决于你的服务器性能和仓库的内容。
如果您需要进行试运行来查看空间使用情况,只需将其发送至/dev/null
- 并按照@Zoredache 提到的那样,根据需要设置流程的优劣。
以下是一些建议:
- 将其从标准输出直接发送到压缩引擎;它们压缩得很好。
- 如果尺寸使用量太大而无法处理(我怀疑可能是这样),请分部分进行。
- 转储前 1000 个修订版本 (
svnadmin dump -r 1:1000
), - 过滤它们,
- 加载到新的 repo 中,
- 删除第一个转储,创建一个新的转储,冲洗并重复。
- 转储前 1000 个修订版本 (