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

时间:2020-03-05 18:58:12  来源:igfitidea点击:

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

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

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

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

解决方案

回答

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

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

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

挂钩脚本是一种响应对存储库事件的响应而运行的脚本(SVN手册:创建挂钩)。

回答

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

回答

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

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

这将创建一个包含最高版本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

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

回答

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

一定也请仔细阅读评论,其中Karl Fogel将文章置于观点之中:-)