【问题标题】:Analyse SVN disk space分析SVN磁盘空间
【发布时间】:2013-02-04 09:06:22
【问题描述】:

我正在寻找一种工具,它可以帮助我分析存储库中不同文件的磁盘空间需求。

在我的存储库中有更大的二进制文件,有几个修订版。

因此,例如,我对存储库中单个二进制文件的所有这些修订版使用了多少空间感兴趣。 AFAIK 无法通过“list”命令轻松获得此信息,因为我不知道 svn 的 deltification 的工作效率如何。

或者哪些是使用最多磁盘空间的文件/文件夹(不仅在头版本中,而且在所有版本中)

有什么想法吗?

【问题讨论】:

  • 您真正的解决方案是不在 svn 中存储二进制文件。
  • 感谢您对 kbb 的评论。我的项目不仅包含源代码,还包含更大的测试数据,这些数据存储在 *.xlsx 或 Matlab *.mat 文件中。我也想对这些文件使用版本控制的优势。
  • 我知道这可能会导致磁盘空间出现问题。但在考虑不同的方法之前,我想知道它有多糟糕。这就是我的问题的来源。
  • 这对你一点帮助都没有,但是 svn 1.8 内置了统计数据收集功能,可以满足你的要求:subversion.apache.org/docs/release-notes/1.8.html#fsfs-stats
  • 感谢 fsfs-stats 的提示,thekbb!

标签: svn analyzer diskspace


【解决方案1】:

一个节点在 Subversion 中使用多少存储空间并不像看起来那么简单。我将讨论 FSFS(并仅提供针对 FSFS 的答案),因为这几乎肯定是您正在使用的文件系统实现。如果您使用的是 BDB,情况会有所不同。

一个节点可以用 4 种方式用完存储。节点的实际文本或主体、属性以及存在的性质,它们使用目录节点中的存储来说明它们的存在(目录节点的主体由其子级的字典和子级的表示组成),以及最后是文件系统的开销(当你提交一个文件时,它会将目录的新表示冒泡到根目录,所以我认为存储的使用应该属于导致需要存储它的文件) .

文件文本和属性占用的空间相对容易想出,目录存储和开销要困难得多。然而,即使对于文件文本这个相对简单的问题,由于表示共享,它仍然有点复杂。表示共享发生在两个文件相同时(文件可以具有相同的名称,或者无关紧要,唯一重要的是它们的文本相同),我们避免再次存储它。

以下单行应该回答单个文件的文件文本问题。

REPO=~/my-repo; FILE=/somebigfile; grep --recursive --no-filename --text --before-context 3 "cpath: $FILE" "$REPO/db/revs/"* | grep 'text:' | cut -d' ' -f 1-7 | sort -u | awk '{ DISK+=$4; if ($5 == 0) { FULL += $4 } else { FULL += $5 } } END { print DISK, FULL, FULL-DISK}'

您需要将 REPO 设置为存储库的路径,并将 FILE 更改为存储库中所需文件的绝对路径。这可能无法完美运行,因为我可能忘记了一些细节。但让我来看看它是如何工作的。

它会为您要查找的文件查找每个修订文件,询问前 3 行以及匹配行。然后它会删除除带有文本的行之外的所有内容:在它们上(详细说明文本表示的行)。然后我们排除最后一个字段(唯一符;用于区分共享表示)。这允许我们将其限制为我们实际存储的唯一表示。然后我们将第 5 个和第 4 个字段(分别是全文大小和表示大小)相加。全文大小可以为零,这意味着它与表示大小相同(我们存储的是全文而不是增量)。最后我们打印出以下字段:实际存储的大小,全文文件所有版本的大小,最后是差异(负数表示我们比存储明文效率低,正数表示我们节省了那么多空间)。

文本数据的字段如下:

revision offset_in_rev_file size_of_rep size_of_full_text md5 sha1 uniquifier

较旧的存储库可能没有所有这些字段,这很好。

因为我依赖文本字段在 rev 文件中 cpath 字段的 3 行内(嘿,这是一个快速破解),所以它可能无法完美运行。您可能希望运行前两个 grep 命令而不运行其他所有命令,然后查看提供的修订版(它们将是左侧的第一组数字)。将其与文件的svn log 的输出进行比较。如果所有的转速都在那里,那么它应该是准确的。

如果我有时间我会尝试编写一个以正确方式(使用 SVN 库)执行此操作并且更有用的实用程序。可能会包括属性使用的存储空间,也可能包括我上面提到的其他一些存储空间。

TL;DR 这不是一个容易回答的问题。使用上面的shell脚本来回答一个文件文本的存储。它会为您提供输出,即我们在磁盘上使用的空间、所有修订的全文空间以及我们节省了多少(负数意味着我们由于增量开销而丢失了空间)。

【讨论】:

  • 谢谢 Ben Reser!这个脚本可以帮助我回答一些问题。
【解决方案2】:

可以转储存储库并过滤掉不需要的旧版本的二进制文件,然后将转储加载回同名的存储库。

您的工具/构建是什么样的?

要记住的另一件事 - 如果您曾经迁移到 git 或 hg,每次克隆时都会拉下这些二进制文件的整个历史记录......因此磁盘空间也会成为客户端的问题。

【讨论】:

  • 我在很多地方都读到过 SVN 可以对二进制文件进行增量处理,这不是真的吗?例如stackoverflow.com/questions/538643/…
  • @JamesP 正确地指出了我的错误 - svn 确实将 delta 存储在二进制文件中。谢谢,伙计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 2014-11-29
相关资源
最近更新 更多