本手册编写用于描述 Subversion 1.6.x 系列。如果您使用的是其他版本的 Subversion,我们强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的文档。
Subversion 追踪树结构,而不仅仅是文件内容。这是 Subversion 被设计用来取代 CVS 的最大原因之一。
对于您来说,作为以前 CVS 的用户,这意味着:
svn add 和 svn delete 命令现在可以作用于目录,就像它们作用于文件一样。同样,svn copy 和 svn move 也是如此。但是,这些命令不会立即对仓库造成任何变化。相反,工作项只是被“安排”添加或删除。在您运行 svn commit
之前,仓库不会发生任何变化。
目录不再是哑容器;它们像文件一样拥有版本号。(或者更确切地说,谈论“版本 5 的目录 foo/
” 是正确的。)
让我们进一步讨论最后一点。目录版本控制是一个难题;因为我们希望允许混合版本的工作副本,所以我们在滥用这种模型的程度方面存在一些限制。
从理论的角度来看,我们定义“版本 5 的目录 foo
” 表示特定的一组目录条目和属性。现在假设我们开始向 foo
添加和删除文件,然后提交。说我们仍然拥有版本 5 的 foo
将是错误的。但是,如果我们在提交之后将 foo
的版本号递增,那也是错误的;可能还有其他我们尚未接收到的对 foo
的更改,因为我们还没有更新。
Subversion 通过在 .svn
区域中默默跟踪已提交的添加和删除来解决这个问题。当您最终运行 svn update
时,所有账户都与仓库结算,目录的新版本号被正确设置。 因此,只有在更新之后,您才能真正说您拥有目录的“完美”版本。 大多数情况下,您的工作副本将包含“不完美”的目录版本。
类似地,如果您尝试提交对目录的属性更改,也会出现问题。通常情况下,提交会增加工作目录的本地版本号。但这又将是错误的,因为可能存在目录尚未拥有的添加或删除,因为没有进行更新。 因此,除非目录已更新,否则您不允许提交对目录的属性更改。
有关目录版本控制的限制的更多讨论,请参阅 名为“混合版本的工作副本”的部分。