本文档旨在描述 Subversion 1.2。如果您运行的是更新版本的 Subversion,我们强烈建议您访问 https://svnbooks.subversion.org.cn/ 并查阅适合您 Subversion 版本的书籍。
如前所述,Subversion 工作副本的每个目录都包含一个名为 .svn
的特殊子目录,其中存放着有关该工作副本目录的管理数据。Subversion 使用 .svn
中的信息来跟踪以下内容:
工作副本目录中的文件和子目录所代表的存储库位置。
工作副本中当前存在的文件和目录的每个版本。
可能附加到这些文件和目录的任何用户定义的属性。
工作副本文件的原始(未编辑)副本。
虽然 .svn
目录中存储了其他一些数据位,但我们将只检查其中两个最重要的项。
也许 .svn
目录中最重要的一個文件是 entries
文件。条目文件是一个 XML 文档,其中包含有关工作副本目录中版本化资源的大部分管理信息。正是这个文件跟踪了存储库 URL、原始版本、文件校验和、原始文本和属性时间戳、调度和冲突状态信息、最后已知提交信息(作者、版本、时间戳)、本地副本历史记录——实际上是 Subversion 客户端想要了解有关版本化(或即将版本化)资源的所有信息!
以下是一个实际条目文件的示例
示例 8.4 典型 .svn/entries
文件的内容
<?xml version="1.0" encoding="utf-8"?> <wc-entries xmlns="svn:"> <entry committed-rev="1" name="" committed-date="2005-04-04T13:32:28.526873Z" url="http://svn.red-bean.com/repos/greek-tree/A/D" last-author="jrandom" kind="dir" uuid="4e820d15-a807-0410-81d5-aa59edf69161" revision="1"/> <entry name="lambda" copied="true" kind="file" copyfrom-rev="1" schedule="add" copyfrom-url="http://svn.red-bean.com/repos/greek-tree/A/B/lambda"/> <entry committed-rev="1" name="gamma" text-time="2005-12-11T16:32:46.000000Z" committed-date="2005-04-04T13:32:28.526873Z" checksum="ada10d942b1964d359e048dbacff3460" last-author="jrandom" kind="file" prop-time="2005-12-11T16:32:45.000000Z"/> <entry name="zeta" kind="file" schedule="add" revision="0"/> <entry name="G" kind="dir"/> <entry name="H" kind="dir" schedule="delete"/> </wc-entries>
如您所见,条目文件本质上是条目列表。每个 entry
标签代表三件事之一:工作副本目录本身(称为“此目录”条目,并标记为空值 name
属性),该工作副本目录中的文件(标记为 kind
属性设置为 "file"
),或该工作副本中的子目录(kind
这里设置为 "dir"
)。存储在此文件中的条目对应的文件和子目录要么已经在版本控制之下,要么(如上面的名为 zeta
的文件)将在用户下次提交此工作副本目录的更改时被调度到版本控制之下。每个条目都有一个唯一的名称,每个条目都有一个节点类型。
开发人员应了解 Subversion 在读取和写入其 entries
文件时使用的一些特殊规则。虽然每个条目都有一个与其关联的版本和 URL,但请注意,样本文件中的并非所有 entry
标签都明确附有 revision
或 url
属性。当这些属性的值与(在 revision
的情况下)或可从 [45] (在 url
的情况下)存储在“此目录”条目中的数据中简单地计算出来时,Subversion 允许条目不显式存储这两个属性。另请注意,对于子目录条目,Subversion 只存储关键属性——名称、类型、URL、版本和调度。为了减少重复信息,Subversion 规定确定关于子目录的完整信息集的方法是遍历到该子目录,并从其自己的 .svn/entries
文件中读取“此目录”条目。但是,对子目录的引用保留在其父级的 entries
文件中,其中包含足够的信息来允许在子目录本身实际上从磁盘中丢失的情况下执行基本版本控制操作。
如前所述, .svn
目录还保存文件的原始“文本基线”版本。这些文件可以在 .svn/text-base
中找到。这些原始副本的优势很多——无网络检查本地修改和差异报告、无网络恢复修改或丢失的文件、向服务器传输更小的更改——但需要在磁盘上至少存储两次每个版本化的文件。如今,对于大多数文件来说,这似乎是一个可以忽略不计的代价。但是,随着版本化文件大小的增加,情况变得更加糟糕。一些人正在关注如何使“文本基线”的存在成为一个选项。具有讽刺意味的是,随着版本化文件大小的增加,“文本基线”的存在变得更加重要——谁愿意仅仅因为要对一个巨大的文件进行微小的更改而跨网络传输它呢?
与“文本基线”文件类似的是属性文件及其原始“属性基线”副本,分别位于 .svn/props
和 .svn/prop-base
中。由于目录也可以有属性,因此还有 .svn/dir-props
和 .svn/dir-prop-base
文件。这些属性文件(“工作”版本和“基线”版本)中的每一个都使用一个简单的“磁盘上的哈希”文件格式来存储属性名称和值。