14

我正在使用一个超过 3 年的 SVN 存储库,包含超过 6,100 次提交,并且大小超过 1.5 GB。在将 SVN 存储库移动到新服务器之前,我想减小 SVN 存储库的大小(我不是在谈论完整 SVN 导出的大小——我指的是服务器上存在的完整存储库)。

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

  • 许多 3rd 方工具的完整安装程序。
  • .jpg 和 .png 文件(它们是位于同一文件夹中的未经修改的 PSD 导出)。
  • Bin 和 Obj 文件夹(然后在下一次提交时被“忽略”)。
  • 更清晰的目录。

自从添加这些大文件以来,其中许多大文件已被“SVN 删除”,从而造成了识别最大违规者的进一步问题。

我想要:

  • 创建一个新的 SVN 存储库,其中仅包含所有软件项目的代码 -复制的文件从旧存储库维护其 SVN 历史记录非常重要。
  • 从现有存储库中删除大型二进制提交和文件。

这些都可能吗?

4

7 回答 7

8

Otherside 是正确的svnadmin dump,等等。这样的事情会给你一个粗略的指针,指向向你的 repo 添加大量数据的修订,并且是候选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$"
于 2010-02-02T01:40:15.923 回答
4

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

这可能不会是一项快速而简单的工作,但它可以完成。我做了类似的事情,只是对一个小得多的存储库。我有一个包含大约 150 个修订版的 repo,大约需要 600MB。

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

于 2010-02-01T14:38:47.097 回答
1

如果您使用“SVN Delete”从存储库中删除了文件,您实际上并没有删除这些文件。这将是 SVN 的美妙之处。一旦文件被添加到存储库中,它就会永远存在(除非使用转储和加载)。在“删除”文件时,您实际上创建了一个新修订来标记删除,但文件继续存在于以前的修订中。

我已经做了一些转储和加载,但是到了一个更大的存储库。大约 60,000 (!!!) 修订。这花了一些时间,但最后,在仔细加载后,再次构建了存储库。

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

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

祝你好运。

于 2010-02-01T14:49:30.010 回答
1

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

于 2013-12-18T06:59:23.973 回答
0

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

因此,只需找到文件,然后svn info对它们进行操作以了解它们是否是存储库的一部分。

于 2010-02-01T13:13:11.553 回答
0

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

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

例如,如果您将完整转储放在 DVD 上,那么您将在需要时获得可用的数据,但是您可以删除整个存储库并 svn 加载修订转储,从而为您留下一个小的干净存储库。

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

于 2010-02-01T16:22:46.390 回答
0

详细说明 Otherside 的答案,这对我特别有用:

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

您可以通过将它们添加到命令中来排除您的Obj和目录——我没有尝试过。Binsvndumpfilter

此外,Subversion 的fsfs-stats程序(Subversion 1.8 中的新程序,在 1.9 中由 by 替换svnfsfs stats)可能有助于量化文件类型和填充存储库的特定文件。

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

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
于 2017-10-03T19:46:43.507 回答