gpt4 book ai didi

svn - 分析SVN磁盘空间

转载 作者:行者123 更新时间:2023-12-01 23:57:19 27 4
gpt4 key购买 nike

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

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

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

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

有什么想法吗?

最佳答案

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

关于svn - 分析SVN磁盘空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14961642/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com