在svn存储库中Nuking巨大的文件

时间:2008-09-17 07:35:26

标签: svn large-files

作为本地subversion czar我向大家解释只保留存储库中的源代码和非大文本文件,而不是巨大的二进制数据文件。可能是较小的二进制文件,它们是测试的一部分。

不幸的是我和人类一起工作!有人可能有一天偶然会犯下一个800MB的二进制垃圾箱。这会降低存储库操作的速度。

上次检查时,您无法从存储库中删除文件;只是让它不是最新版本的一部分。如果有人想要回忆该日期或修订号的存储库状态,存储库会永久保留怪物。

有没有办法真正删除那个怪物文件并最终得到一个像样的大小的存储库?我已经尝试了svnadmin转储/加载的东西,但这很痛苦。

4 个答案:

答案 0 :(得分:17)

要从svn存储库中永久删除怪物文件,除了使用svnadmin dump / load之外,没有其他解决方案。 (SVN Book: dump command

为了防止提交大文件,可以使用钩子脚本。举例来说,只要有人试图提交到存储库,就可以运行“预提交”的脚本。该脚本可能会检查filesize或filetype,如果它包含一个或多个文件太大或“禁止”类型,则拒绝提交。

钩子脚本的更常见用法是检查(预提交)提交包含日志消息,或(提交后)电子邮件提交的详细信息或使用新提交的文件更新网站。

钩子脚本是为响应对存储库事件(SVN Book: Create hooks)的响应而运行的脚本。

答案 1 :(得分:13)

有关此内容的一些额外信息可以在博客文章中找到:Subversion Obliterate, the missing feature

请务必仔细阅读评论,Karl Fogel将文章放在一边: - )

答案 2 :(得分:3)

如果你能在提交后立即捕获它,那么svnadmin转储/加载技术并不会太痛苦。假设有人在版本3849中意外地犯了gormundous-raw-image.psd。你可以这样做:

svnadmin dump /var/repos -r 1:3848 > ~/repos_dump

这将创建一个转储文件,其中包含修订版3848以及包括修订版3848在内的所有内容。此时,您可以使用svnadmin create和svnadmin load重新构建存储库而不会违反提交,需要注意的是您在存储库中所做的任何更改目录结构 - 钩子,符号链接,权限更改,身份验证文件等 - 需要从旧目录复制。以下是您可能用于完成操作的其余bash会话的示例:

svnadmin create /var/repos-new
svnadmin load /var/repos-new < ~/repos_dump
cp -r /var/repos/conf /var/repos-new
cp -r /var/repos/hooks /var/repos-new
mv /var/repos{,-old} && mv /var/repos-new /var/repos

我确信您的存储库拥有的历史记录会更加痛苦,但确实有效。

答案 3 :(得分:1)

从HEAD修订版中删除文件后,由于处理修订版之间的增量,因此不会降低操作速度。 (存储库备份当然必须处理负载)。