4

我不明白为什么大文件的微小差异会导致我的 subversion 存储库增长如此之多。

我有一些测试使用的数据库内容的 zip 文件。我想将每个新版本的测试数据存储在我们的 subversion 存储库中。

我做了一些实验,检查了 data.zip 的最后几个版本,并查看了存储库大小的变化。未压缩的数据约为 150MB,压缩和压缩后约为 50MB。签入存储库的每个新版本的 data.zip 文件都会使存储库的大小增加约 50MB。我认为它应该只增加一个我预计会少得多的增量。

Subversion 使用 xdelta 来存储压缩的差异数据。我确认 SVN 可以做得更好的尝试是下载 xdelta 并检查两个版本之间没有太大区别。确实

xdelta3.0z.x86-64.exe -e -s v1_path\data.zip v2_path\data.zip v1v2_delta.file

生成了一个大约 3MB 的 v1v2_delta.file。

我查看了位于 [myrepo]\db\revs 的 SVN 存储库,可以看到每个新版本的大文件

02/08/2011  11:12        57,853,082 4189
02/08/2011  11:40        51,713,289 4190
02/08/2011  11:46        52,286,060 4191

(4189、4190 和 4191 是文件名。)

我什至尝试在不压缩的情况下压缩 data.zip。这对 SVN 存储的内容没有影响 - 从外观上看,我的猜测是它存储了每个修订版的整个 data.zip 的压缩副本,而不仅仅是第一个修订版。我正在运行带有 FSFS 后端的 SVN 1.6。

关于提交二进制文件以及 SVN 如何存储增量,例如多次修订后的 SVN 性能,还有各种其他好的 stackoverflow 答案。但是我无法从这些中看出为什么在上述情况下没有存储增量 - 即。如果 xdelta 可以让如此小的差异独立运行,那么 SVN 肯定也可以 - 或者它选择不这样做?!

编辑:我也尝试过 tar (未压缩)文件,SVN 再次没有有效地存储它们。此外,我发现我们在 SVN刚刚存储 diffs的不同存储库中有一个相同数据格式的 zip 文件(尽管小得多)。

所以这个问题的总结版本是:SVN 可以有效地存储二进制文件,例如10 个略有不同的 CAD 文件的大小仅为 1 的 1.2 倍。SVN 有时甚至可以通过压缩 zip 文件节省空间。但显然二进制文件并不总是节省空间 - 在什么情况下会出现这种情况?

4

4 回答 4

3

概括

由于为压缩分配了多少内存,Subversion 有时会比 xdelta 独立版本更糟糕。这是目前无法更改的颠覆行为,从 1.6 版开始。

细节

我在 subversion 邮件列表上询问了为什么 subversion 存储库文件似乎比它们应该的大

结论是,如果你给它更多的内存,xdelta 可以产生更小的增量

在此线程中回读另一个遇到相同问题的其他人的示例

感谢最近和四年前在颠覆邮件列表上的各种人。

也有这个问题?

如果您正在通过 subversion 存储库分析磁盘使用情况,请了解跳过 deltas并使用此grep DELTA 技巧来确定用于 delta 的基础。

假设,像我一样,你真的想在存储库中存储二进制文件,这是我对一些解决方法的猜测(它们都不是很容易!):

  1. 修改subversion源代码并构建自己的xdelta内存窗口设置为更大
  2. 你是否拥有 xdelta-ing - 将 delta 检查到源代码控制中,并有一些疯狂的重建过程
  3. 迁移到 Git - 它一定会有更好的压缩(疯狂猜测)
于 2011-08-09T19:08:08.207 回答
1

我认为压缩将完全改变二进制文件的构成,因此 svn 将不得不存储巨大的增量。即使更改压缩文件内容的几个字符也可以彻底改变它。

在源代码管理中存储二进制文件通常是一个坏主意,我认为您应该寻找替代方案。

于 2011-08-02T19:39:42.813 回答
1

在压缩存档中添加或修改文件时,压缩文件的二进制内容可能会发生巨大变化。认为可能会发生更改可能会发生在存档的特定元素中,并且压缩文件文件的大部分区域不会发生重大更改。但是,在正常情况下会出现这种情况是“运气”的问题(当然,这并没有真正的运气,但计划实现它有点复杂)

这在熵编码算法中是很正常的,例如 Huffman(仅举一个最简单的算法),因为在添加或修改文件时符号的频率会发生变化。如果这发生在存档内容的开头,则可能会严重影响更改后文件的整个内容。

于 2012-04-22T09:38:47.237 回答
-1

您是否使用了 fsfs 文件系统支持?我记得,它每次都存储一个新副本(尽管它可能被压缩)。您为什么希望 SVN 存储二进制文件的差异?SVN 是一个源代码控制系统(意思是文本),而不是一个通用的二进制控制系统(尽管它在存储二进制文件方面做得不如它所能做的那么糟糕)。

于 2011-08-02T21:05:12.700 回答