【问题标题】:Nuking huge file in svn repository核对svn存储库中的巨大文件
【发布时间】:2008-09-17 07:35:25
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: svn large-files


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      请务必通读 cmets,卡尔·福格尔 (Karl Fogel) 对文章进行了透视 :-)

      【讨论】:

      • 链接页面现在是 404。希望您能够编辑以使此答案保持最新状态。
      • 编辑它以指向网页的存档版本。不过,编辑对答案的实际响应可能是可行的。
      【解决方案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
      

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 我们有足够的大文件来备份 - 不要再想要了!
        猜你喜欢
        • 2012-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多