分析SVN磁盘空间

use*_*749 4 svn diskspace analyzer

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

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

因此,我对例如在存储库中使用单个二进制文件的所有修订版本的空间感兴趣.AFAIK这个信息不容易通过'list'命令获得,因为我不知道svn的整理效率有多高.

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

任何的想法?

Ben*_*ser 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}'
Run Code Online (Sandbox Code Playgroud)

您需要将REPO更改为设置为存储库的路径,并将FILE更改为存储库中所需文件的绝对路径.这可能不完美,因为我可能忘记了一些细节或其他细节.但让我来看看它的工作原理.

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

文本数据的字段如下:

revision offset_in_rev_file size_of_rep size_of_full_text md5 sha1 uniquifier
Run Code Online (Sandbox Code Playgroud)

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

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

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

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