18

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

不幸的是我和人类一起工作!有人可能有一天会不小心提交了一个 800MB 的二进制 hulk。这会减慢存储库操作。

上次我检查时,您无法从存储库中删除文件;只是使它不属于最新版本。存储库永远保留这个怪物,以防有人想回忆那个日期或修订号的存储库状态。

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

4

4 回答 4

17

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

为了防止提交大文件,可以使用挂钩脚本。例如,当有人尝试提交到存储库时,您可以拥有一个运行“预提交”的脚本。该脚本可能会检查文件大小或文件类型,如果它包含一个或多个文件太大或属于“禁止”类型,则拒绝提交。

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

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

于 2008-09-17T07:48:34.893 回答
13

关于这方面的一些额外信息可以在博客文章中找到:Subversion Obliterate, the missing feature

一定要仔细阅读评论,卡尔福格尔将文章放在透视图中:-)

于 2008-09-18T21:34:40.610 回答
3

如果您可以在它提交后立即捕获它,那么 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

我敢肯定,您的存储库拥有的历史越多,这将越痛苦,但它确实有效。

于 2008-09-17T17:04:48.490 回答
1

从 HEAD 修订中删除文件后,它不会减慢您的操作速度,因为只处理修订之间的增量。(存储库备份当然必须处理负载)。

于 2008-09-17T08:14:20.760 回答