首页 文章

如何识别并可能删除SVN存储库中的大二进制提交?

提问于
浏览
14

我正在使用一个超过3年的SVN存储库,包含超过6,100个提交,大小超过1.5 GB . 我想减少SVN存储库的大小(我不是在谈论完整SVN导出的大小 - 我的意思是服务器上存在的完整存储库),然后再将其移动到新服务器 .

当前存储库包含所有软件项目的源代码,但它还包含相对较大的二进制文件,例如:

  • 许多第三方工具的完整安装程序 .

  • .jpg和.png文件(这些文件是生活在同一文件夹中的未经修改的PSD导出) .

  • Bin和Obj文件夹(然后是'svn ignored'下一次提交) .

  • Resharper目录 .

自添加以来,许多这些大型文件已被“SVN删除”,这进一步造成了识别最大违法者的问题 .

我想要:

  • 创建一个新的SVN存储库,其中只包含所有软件项目的代码 - 复制的文件从旧存储库中维护其SVN历史记录是 really important .

  • 从现有存储库中删除大型二进制提交和文件 .

这些都可能吗?

7 回答

  • 1

    您必须使用svnadmin dump获取当前存储库的转储文件,并可能使用svndumpfilter来处理转储文件 . 您也可以手动修改转储文件,只要您小心 .

    它可能不会是一个快速而简单的工作,但它可以做到 . 我做了类似的事情,只做了一个小得多的存储库 . 我有一个大约150个修订版的回购,大约需要600MB .

    从当前存储库进行转储,进行必要的更改并尝试在新存储库中加载已修改的转储文件 . 然后检查新的存储库以确保一切仍然有意义(历史记录仍然正确,路径中没有奇怪的变化,......) .

  • 1

    其他方面是关于 svnadmin dump 等等 . 像这样的东西会让你粗略地指向修改,这些修改为你的回购添加了大量数据,并且是 svndumpfilter 的候选者:

    for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do
       echo "revision $r is " `svn diff -c $r | wc -c` " bytes";
    done
    

    您也可以尝试这样的方法来查找添加了具有特定扩展名的文件的修订版(此处为.jpg):

    svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$"
    
  • 0

    如果使用“SVN删除”从存储库中删除了文件,则实际上并未删除文件 . 这将是SVN的美丽 . 将文件添加到存储库后,它将永远存在(除非使用转储和加载) . 在“删除”文件时,您实际创建了一个标记删除的新修订,但文件在以前的修订版中仍然存在 .

    我已经做了一些转储和加载,但是到了更大的存储库 . 大约6万(!!!)修订 . 这需要时间,但最后,在小心加载后,再次构建存储库 .

    您唯一的方法是列出添加,修改和删除文件的修订版 . 然后转储它们之间的修订,并按正确的顺序加载它们 . 请注意,没有错误的余地 . 如果你犯了错误,你将不得不重新开始 . 从一开始就转储和加载 .

    我的建议是,如果大文件存在这样的问题,可以考虑创建一个没有历史记录的新的存储库 . 保留旧的用于历史比较,并从新鲜开始工作 .

    祝好运 .

  • 0

    如果您只需要找到有问题的提交并且您可以访问托管存储库的服务器:在存储库的db / revs子目录中查找大文件(假设它使用fsfs格式) .

  • 0

    这不是一个不同的问题,还有一个额外的步骤吗?即您需要找到您认为是大型和二进制文件的文件,然后检查它们是否确实由SVN管理或者是否已在本地构建(或者从并行资产系统导入,如果它已经到位) .

    所以,只需查找文件,然后对它们执行 svn info 以查明它们是否属于存储库 .

  • 8

    只是一个小小的想法,你说存储库的当前状态(当前的HEAD)是好的,即过去已经删除了大的二进制文件svn . 因此,您的问题纯粹是存储库的大小?

    我知道你说你想保留所有的提交历史,但作为一个选项,你可以做两个转储,一个用于整个修订历史,一个用于当前的HEAD修订 .

    例如,如果您将完整的转储放到DVD上,那么如果您需要它可以获得数据,但是您可以删除整个repository和svn加载修订转储,为您留下一个小的干净存储库 .

    也可以从特定版本开始转储,而不仅仅是头部转换,例如,您可以保留最近3个月的修订版本并将旧版本的所有内容转储到DVD上....

  • 4

    详细阐述了另一方的答案,以下是对我有用的内容:

    svnadmin create new-repo
    svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo
    

    您可以通过将 ObjBin 目录添加到 svndumpfilter 命令来排除它们 - 我没有尝试过 .

    此外,Subversion的 fsfs-stats 程序(Subversion 1.8中的新功能,由1.9替换为 svnfsfs stats )可能对量化填充存储库的文件类型和特定文件很有用 .

    这对于以后比较存储库可能很有用:

    colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
    

相关问题