在SVN存储库中裸体巨大的文件

在SVN存储库中裸体巨大的文件

Nuking huge file in svn repository

作为本地Subversion沙皇,我向所有人解释,仅将源代码和非巨大的文本文件保留在存储库中,而不保留巨大的二进制数据文件。可能是测试的一部分较小的二进制文件。

不幸的是,我与人类一起工作!某人可能有朝一日不小心犯下了800MB的二进制文件。这减慢了存储库操作。

上次检查时,您无法从存储库中删除文件;仅使其不属于最新修订版。如果有人想回想该日期或修订号的存储库状态,该存储库将使怪物永久保存。

有没有一种方法可以真正删除该怪物文件并最终得到一个大小合适的存储库?我已经尝试了svnadmin转储/加载,但这很痛苦。


要从svn信息库中永久删除怪物文件,除了使用svnadmin dump / load之外,没有其他解决方案。 (SVN书:转储命令)

为防止提交大文件,可以使用钩子脚本。例如,您可能有一个脚本,该脚本在有人尝试提交到存储库时会"预先提交"。该脚本可能会检查文件大小或文件类型,如果包含的文件太大或"禁止"类型,则拒绝提交。

钩子脚本的更典型用法是检查(提交前)提交中是否包含日志消息,或(提交后)通过电子邮件发送该提交的详细信息或使用新提交的文件更新网站。

钩子脚本是响应对存储库事件的响应而运行的脚本(SVN书:创建钩子)。


关于此的一些其他信息可以在博客文章中找到:Subversion Obliterate,缺少的功能

请确保也仔细阅读评论,其中Karl Fogel将文章置于透视之中:-)


如果您可以在提交后立即捕获它,那么svnadmin转储/加载技术就不会太痛苦。假设有人在修订版3849中意外地提交了gormundous-raw-image.psd。您可以执行以下操作:

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

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

1
2
3
4
5
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

我敢肯定,您的存储库拥有的历史越多,这会越痛苦,但是它确实可以工作。


一旦您从HEAD修订版中删除了文件,它就不会降低您的运行速度,因为处理了修订版之间的ony差异。
(存储库备份当然必须处理负载)。


推荐阅读