2013-02-19 188 views
4

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

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

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

或者是其使用的磁盘空间最多(不仅在头修订,但在所有版本一起)

任何想法的文件/文件夹?

+1

你真正的解决方案是不存储svn中的二进制文件。 – thekbb 2013-02-19 17:04:52

+0

感谢您的提交thekbb。我的项目不仅包含源代码,还包含更大的测试数据,这些数据存储在* .xlsx或Matlab * .mat文件中。我想利用版本控制的优势也为这些文件。 – user2087749 2013-02-20 07:53:47

+0

我知道这可能会导致磁盘空间问题。但在考虑不同的方法之前,我想知道它有多糟糕。这就是我的问题来自哪里。 – user2087749 2013-02-20 08:02:00

回答

1

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

什么是你的工具/构建看起来像?

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

+2

我读过很多SVN可以对二进制文件做增量转换的地方,这是不是真的?例如http://stackoverflow.com/questions/538643/how-good-is-subversion-at-storing-lots-of-binary-files – 2013-02-20 15:51:37

+0

@JamesP正确地指出了我的错误 - svn的确在二进制文件中存储delta。谢啦。 – thekbb 2013-02-20 21:20:26

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设置为路径到您的资料库和文件被存储库到你想要的文件中的绝对路径。这可能不完美,因为我可能忘记了一些细节或其他。但让我来看看它是如何工作的。

它会查找您要查找的文件的每个修订文件,请求前面的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脚本来回答文件文本的存储。它会给你输出的是我们在磁盘上使用的空间,所有修订版全文的空间,然后我们保存了多少(负面意味着我们由于增量开销而损失了空间)。

+0

谢谢Ben Reser!这个脚本帮助我回答我的一些问题。 – user2087749 2013-02-21 09:29:56