我正在寻找一个工具,它可以帮助我分析存储库中不同文件的磁盘空间要求。
在我的存储库中有更大的二进制文件,有几个版本。
所以我对例如在存储库中使用单个二进制文件的所有修订版本的空间感兴趣。 AFAIK这个信息不容易通过'list'命令获得,因为我不知道svn的整理效率有多高。
或者哪些是使用最多磁盘空间的文件/文件夹(不仅在头版本中,而且在所有版本中一起使用)
有什么想法吗?
答案 0 :(得分:5)
节点在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行以及匹配行。然后它删除除了带有text:的行以外的所有内容(详细说明文本表示的行)。然后我们排除最后一个字段(唯一符;用于区分共享表示)。这允许我们将其限制为我们实际存储的唯一表示。然后我们将第5和第4个字段(分别是全文大小和表示大小)相加。全文大小可以为零,这意味着它与表示大小相同(我们存储的全文不是delta)。最后,我们打印出以下字段:实际存储的大小,全文文件的所有版本的大小,最后差异(负数意味着我们的效率低于存储明文,积极意味着我们节省了大量空间)。
文本数据的字段如下:
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脚本来回答文件文本的存储。它将为您提供输出,即我们在磁盘上使用的空间,所有修订版全文的空间,然后我们节省了多少(负面意味着我们因增量开销而丢失了空间)。
答案 1 :(得分:1)
可以转储存储库并过滤掉旧的不需要的二进制版本,然后将转储加载回同名的存储库。
你的工具/构建是什么样的?
要记住的另一件事 - 如果您迁移到git或hg,每次克隆时都会下拉这些二进制文件的整个历史记录...因此磁盘空间也成为客户端的问题。 / p>