一个节点在 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脚本来回答一个文件文本的存储。它会为您提供输出,即我们在磁盘上使用的空间、所有修订的全文空间以及我们节省了多少(负数意味着我们由于增量开销而丢失了空间)。