本手册旨在描述 Subversion 1.6.x 系列。如果您运行的是其他版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/,并查阅适合您 Subversion 版本的文档。
如前所述,Subversion 工作副本中的每个目录都包含一个名为 .svn
的特殊子目录,其中包含有关该工作副本目录的管理数据。Subversion 使用 .svn
中的信息来跟踪以下内容:
工作副本目录中的文件和子目录所代表的存储库位置
工作副本中当前存在的文件和目录的每个版本
可能附加到这些文件和目录的任何用户定义属性
工作副本文件的原始(未编辑)副本
Subversion 工作副本管理区域的布局和内容被认为是实现细节,并非真正面向人类使用。鼓励开发人员使用 Subversion 的公共 API 或 Subversion 提供的工具来访问和操作工作副本数据,而不是直接读取或修改这些文件。工作副本库用于管理数据的文件格式会不时发生变化,而公共 API 很好地将此变化隐藏在普通用户面前。在本节中,我们将展示一些这些实现细节,仅仅是为了满足您强烈的求知欲。
也许 .svn
目录中最重要的文件是 entries
文件。它包含关于工作副本目录中版本化项的大部分管理信息。此文件跟踪存储库 URL、原始版本、文件校验和、原始文本和属性时间戳、调度和冲突状态信息、最后已知的提交信息(作者、版本、时间戳)、本地副本历史记录,几乎所有 Subversion 客户端都希望了解有关版本化(或要版本化)资源的信息!
熟悉 CVS 管理目录的人会注意到,Subversion 的 .svn/entries
文件起到了 CVS 的 CVS/Entries
、CVS/Root
和 CVS/Repository
文件的组合作用。
.svn/entries
文件的格式随着时间的推移发生了变化。最初是一个 XML 文件,现在使用自定义格式,尽管仍然可读。虽然 XML 对于 Subversion 的早期开发者来说是一个很好的选择,他们经常调试文件的内容(以及 Subversion 针对这些内容的行为),但随着 Subversion 的成熟,对轻松开发者调试的需求已经减弱,并被用户对更快性能的需求所取代。请注意,Subversion 的工作副本库会自动将工作副本从一种格式升级到另一种格式,它会读取旧格式并写入新格式,这可以免去您签出新工作副本的麻烦,但也可能使不同版本的 Subversion 尝试使用相同工作副本的情况变得复杂。
如前所述,.svn
目录还包含文件的原始 “text-base” 版本。您可以在 .svn/text-base
中找到它们。这些原始副本的好处有很多,比如无网络本地修改检查和差异报告、无网络修改或丢失文件的还原、更有效地将更改传输到服务器,但它们需要在磁盘上至少存储两次每个版本化的文件。如今,对于大多数文件来说,这似乎是一个可以忽略不计的代价。但是,随着版本化文件大小的增加,情况变得更糟。一些人正在关注将 “text-base” 的存在作为一种选择。具有讽刺意味的是,随着版本化文件大小的增加,“text-base” 的存在变得更加重要,谁愿意仅仅因为要对一个大型文件进行微小的更改而将它传输到网络上?
与 “text-base” 文件类似的是属性文件及其原始 “prop-base” 副本,分别位于 .svn/props
和 .svn/prop-base
中。由于目录也可以有属性,因此还有 .svn/dir-props
和 .svn/dir-prop-base
文件。