在svn代码库中彻底删除大文件

18
作为本地的Subversion专家,我向每个人解释仅应将源代码和非巨型文本文件存储在版本库中,而不是巨大的二进制数据文件。也许可以将测试中的较小二进制文件放入版本库中。
不幸的是,我与“人类”一起工作!某个人可能会意外地提交一个800MB的二进制巨兽。这会减慢版本库操作。
据我上次检查,您无法从版本库中删除文件;只能使其不是最新版本的一部分。版本库将保存该巨兽以备将来需要回溯到该日期或版本号的状态。
是否有一种方法可以真正删除那个庞然大物并获得一个合适大小的版本库?我尝试了svnadmin dump / load方法,但非常麻烦。
4个回答

17
要从svn存储库永久删除怪物文件,没有其他解决方案,只能使用svnadmin dump/load命令。(《SVN Book: dump command》
为了防止提交过大的文件,可以使用钩子脚本。例如,您可以编写一个脚本,在某个人尝试提交到存储库时运行“pre-commit”。脚本可能会检查文件大小或文件类型,并且如果包含太大或“禁止”类型的文件,则会拒绝提交。
更典型的钩子脚本用途是检查(pre-commit)提交是否包含日志消息或(post-commit)发送提交详细信息的电子邮件或使用新提交的文件更新网站。
钩子脚本是在存储库事件响应中运行的脚本。(《SVN Book: Create hooks》

13

2
链接页面现在是404错误页面。希望能够编辑以保持答案的最新性。 - hayesgm
1
已将其编辑为指向网页的存档版本。虽然编辑实际答案的响应可能是可行的。 - eis

3

如果你能在提交后立即捕获它,那么svnadmin dump/load技术并不痛苦。假设有人在修订版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

我相信如果你的代码库有更多历史记录,这个过程会更加痛苦,但它确实可以工作。


1

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


1
我们已经有足够多的大文件需要备份 - 不想再增加了! - DarenW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接