Subversion 会记录目录树的结构,不仅仅是文件的内容。这是编写 Subversion 替代 CVS 最重要的一个原因。
以下是对你这意味着什么的说明,作为一个前CVS用户:
svn add 和 svn delete
现在也工作在目录上了,就像在文件上一样,还有 svn copy 和 svn
move
也一样。然而,这些命令不会导致版本库即时的变化,相反,工作的项目只是“调度”添加和删除,在运行
svn commit
之前没有版本库的修改。
目录不再是哑容器了;它们也有文件一样的版本号。(更准确的说,谈论“版本 5
的目录foo/
”是正确的。)
让我们再讨论最后一点。目录版本化是一个困难的问题;因为我们希望允许混合版本的工作副本,有一些防止我们滥用这个模型的限制。
从理论观点,我们定义“目录foo
的版本 5”
意味着一组目录条目和属性。现在假定我们从 foo
开始添加和删除文件,然后提交。如果说我们还有
foo
的版本 5 就是一个谎言。然而,如果说我们在提交之后增加了
foo
的版本号码,这也是一个谎言;还有一些 foo
的修改我们没有得到,因为我们还没有更新。
Subversion 通过在 .svn
区域偷偷的纪录添加和删除来处理这些问题,当你最后运行
svn
update,所有的变更都会与版本库同步,并且目录的新版本号会正确设置。因此,只有在更新之后才可以真正安全地说我们有了一个“完美的”修订版本目录。在大多数时候,你的工作副本会保存“不完美的”目录修订版本。
同样的,如果你尝试提交目录的属性修改会有一个问题。通常情况下,提交应该会提高工作目录的本地修订版本号。但是再次说,这还是一个谎言,因为这个目录还没有发生添加和删除,因为还没有发生更新。因此,在你的目录不是最新的时候不允许你提交属性修改。
关于目录版本的更多讨论见第 2.4.3 节 “混合版本的工作副本”。