1

我正在为学期论文研究有关颠覆内部数据结构的信息。我已经找到http://svn.apache.org/repos/asf/subversion/trunk/subversion/libsvn_fs_fs/structure但找不到其他信息。

在一个新的存储库中,我提交了一个包含一些测试行的简单文本文件。

DELTA
SVN▒▒   ▒▒▒Dies ist die erste Datei im SVN-Repository. Ebenfalls ist dies die erste Zeile der Ersten Datei.
Dies ist die zweite Zeile der ersten Datei.
//leerzeile
Diese Zeile wird in der nächsten Revision gelöscht werden.
//leerzeile
Dies ist die letzte Zeile der Datei.
ENDREP
id: 0-1.0.r1/293
type: file
count: 0
text: 1 0 280 263 f76e56eefcb558ac6682682c05c16eb8 785a12924cf4a78d97cb10ba9903086bf3683d2d 0-0/_2
cpath: /Erste Datei.txt
copyroot: 0 /

PLAIN
K 15
Erste Datei.txt
V 17
file 0-1.0.r1/293
END
ENDREP
id: 0.0.r1/529
type: dir
pred: 0.0.r0/17
count: 1
text: 1 468 48 48 6d3f404edb0eca280b1f748b565436c9
cpath: /
copyroot: 0 /

_0.0.t0-0 add-file true false /Erste Datei.txt


529 654

第一个块(以 DELTA 开头,以空行结尾)在结构文件中进行了说明,但它下面的部分没有。

这里有人可以向我解释吗?当然,我看到“K 15”之后的行是文件名,“V17”之后的行是上面 Delta 中描述的内容,但是这些信息在哪里使用?

感谢您的帮助

4

1 回答 1

2

那是存储库根目录的目录表示。将 Subversion 中的目录视为只是文件,其中文件的内容是目录的哈希转储(如您链接的页面中所述)。

如果表示是目录节点的文本内容,则扩展内容是哈希转储格式,将条目名称映射到“”对,其中是“文件”或“目录”,并给出子节点-rev的ID。

直到最近,目录表示总是写成一个PLAIN(即全文),但从1.8.0 开始,它可以写成一个DELTA(当存储库有一个非常深的树时,这大大减少了所需的存储空间)。

我们有目录表示的原因是因为我们已经将单个文件的存储从其在树中的位置抽象出来。首先,这用于实现廉价副本。当您分支时(通过复制命令),Subversion 不会为树中的文件写出新的文件内容表示,而是简单地为该点写出新的目录表示,指向现有的文件表示。这进一步用于表示共享(它使用数据库来避免存储通过合并独立添加或创建的相同内容)。

您可能还想阅读Subversion Design Document中描述的用于存储的目录冒泡方法。请注意,该文档非常陈旧,并且并非完全最新。但是冒泡的信息仍然是准确的和信息性的。

我会向您指出 Stefan Fuhrmann 在 Subversion 和 Git Live 2013 上的演讲,但我认为它还没有发布到网络上。但它会有一些关于文件系统格式工作的花絮,您可能会觉得有趣。

如果您还有其他问题,请随时在 irc.freenode.net 上通过 #svn-dev 进行讨论。

于 2013-11-11T05:04:58.210 回答