使用之前在“复制-修改-合并 方案”一节中描述的复制-修改-合并 的方法,Subversion通常不需要锁就可以很好的工作。但是,在某些情况下你可能需要制定某种锁定策略。

首先,你需要确保你的 Subversion 服务器端升级到至少 1.2 版本。早期版本不支持锁定。如果您正在使用 file:// 访问,那么当然只有你的客户端需要更新。

The Three Meanings of Lock

In this section, and almost everywhere in this book, the words lock and locking describe a mechanism for mutual exclusion between users to avoid clashing commits. Unfortunately, there are two other sorts of lock with which Subversion, and therefore this book, sometimes needs to be concerned.

The second is working copy locks, used internally by Subversion to prevent clashes between multiple Subversion clients operating on the same working copy. Usually you get these locks whenever a command like update/commit/... is interrupted due to an error. These locks can be removed by running the cleanup command on the working copy, as described in “清理”一节.

And third, files and folders can get locked if they're in use by another process, for example if you have a word document opened in Word, that file is locked and can not be accessed by TortoiseSVN.

You can generally forget about these other kinds of locks until something goes wrong that requires you to care about them. In this book, lock means the first sort unless the contrary is either clear from context or explicitly stated.

锁定在Subverion中是如何工作的

默认情况下,所有的东西都没有锁定,只要有提交权限的人都可以在任何时候提交任何的文件。其他人会定时更新他们的工作副本,在库中的改变的东西都会与本地合并。

如果你对一个文件 取得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。一个被锁定的文件不能在库中进行任何形式的合并。所以它不能除锁的拥用者之外的人删除或更名。

重要

锁定不是分配给一个特定用户,而是一个特定用户和一个工作副本。工作副本上的锁定也可以防止同一用户从另一个工作副本中提交已锁定的文件。

举一个例子,假设用户 Jon 在他的办公室电脑上有一个工作副本。他开始对一个图像进行工作,并因此获得了该文件的锁定。当他离开办公室时还没有完成该文件的工作,所以他不会解除该锁定。回到家里 Jon 也有一个工作副本,并决定继续该项目的工作。但是他却不能修改或提交相同的图像文件,因为该文件的锁定驻留在办公室里的工作副本中。

但是,其他用户不必知道你已经增加了锁定,除非他们定期地检查锁定的状态。这其实没什么意义,因为他们发现提交失败的时候就可以知道锁定了。为了更容易管理锁,而设置了一个新的Subversion属性 svn:needs-lock。当一个文件的这个属性被设置(成任意值)的时候,每当该文件检出或更新时,本地的副本都被设成只读,除非该工作副本就是拥有锁的那个用户的。这么做是为了能警告你,你不应该修改这个文件,除非你申请到了锁定。受控只读的文件在TortoiseSVN中用一个特殊的图标来表示你需要在编辑前取得锁定。

锁除了按所有者记录外,还在工作副本中记录。如果你有多个工作副本(在家,在单位),那么在这些工作副本中,只允许对其中一份拥有锁。

如果你的合作者之一请求一个锁,但却外出旅游去了,你怎么办?Subversion提供了一种强制锁。释放别人拥有的锁被称为破坏锁定,强制获得别人拥有的锁称为窃取锁定。当然,如果你想要与你的合作者保持良好的关系,轻易不要这么做。

锁在库中进行记录,一个锁定令牌建立在你的本地工作副本中。如果有矛盾,比如某人破坏了锁下,那么本地的锁定令牌将不可用。库中的记录将是最权威的参考。

取得锁定

选择工作副本中你想要获取锁定的文件,然后选择命令TortoiseSVN取得锁定....

图 4.59. 锁定对话框

锁定对话框


出现一个对话框,允许你输入注释,这样别人可以知道你为什么锁定这个文件。注释是可选的,并且只用于基于Svnserve的库。当(且当)你需要窃取别人的锁的时候,勾选偷取此锁定复选框,然后点击确定

您可以设置项目属性 tsvn:logtemplatelock 给要填写如锁定信息的用户提供一个信息模板。请参阅 “项目设置”一节 有关如何设置属性的说明。

如果你选择一个文件夹,使用TortoiseSVN获取锁定...锁定对话框将显示所有子文件夹中的所有文件 。如果你真的要锁定整个目录,就这么做,但如果你这么做,可能会很不受你的合作者的欢迎。小心使用...

释放锁定

为了确保你不会忘记释放锁,你不需要做别的事,在提交对话框中,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,选中的文件中的锁就被移除了,就算你从没有修改过。如果你不希望释放某文件的锁,你可以取消选中它(如果你没有修改过)。如果你希望保持一个修改过的文件的锁,你需要在提交之前选中保持锁定复选框。

要手动释放锁定,选中工作副本中要释放的文件,选择命令TortoiseSVN释放锁定。不需要输入什么 TortoiseSVN会联系版本库并释放锁。你可以对一个文件夹来使用这个命令释放其中的所有锁定项。

检查锁定状态

图 4.60. 检查修改对话框

检查修改对话框


要查看你和他人所拥有的锁,你可以使用TortoiseSVN检查修改...命令。本地的锁定令牌会立即显示出来,要查看别人拥用的锁定(或是检查你的锁是否被破坏或窃取)你需要点击检查版本库

从此处的右键菜单中,你可以获取锁或是释放锁,也可以破坏或是窃取别人的锁。

避免破坏和窃取锁定

如果你在破坏或是窃取某人的锁的时候没有告诉他,你可能会丢掉工作。如果你正在写一个不可合并的文件类型,并且你窃取了某人的锁,一旦你释放了锁,他们就可以随意检入他们的修改以覆盖你的。Subversion并不会丢弃数据,但你却失去了锁带来的对团队工作的保护。

让非锁定的文件变成只读

正如上面提到的,最有效的使用锁的方式是对一个文件设置svn:needs-lock属性。参考“项目设置”一节如何设置属性。带有此属性的文件将总被按只读的方式检出和更新(除非你的工作副本拥有锁定)。

作为提醒的方式之一,TortoiseSVN使用一个特殊的图标表示。

如果你想实行一个每个文件必须被锁定的策略,那么您可能会发现使用 Subversion 的 auto-props 功能来为你每次新添加的文件自动设置属性是更容易的。自动设置属性每次添加新的文件。阅读 “自动属性设置”一节 以进一步了解信息。

锁定钩子脚本

当你使用Suversion1.2或更新的版本建立新的版本库的时候,建立了四个钩子模板在版本库中的hooks目录下。这些钩子模板在取得/释放一个锁定之前和之后会被分别调用。

安装一个 post-lockpost-unlock钩子,在钩子中为锁定和解锁事件发送邮件,是个好主意 。有了这种脚本,你的所有用户都会在一个文件被锁定/解锁的时候被通知。在你的版本库文件夹下,你可以找到一个示例钩子脚本hooks/post-lock.tmpl

你可能也使用hooks来拒绝破坏或是窃取锁定,或是限制只有管理员可以,或是当一个用户破坏或窃取锁定时通知原来的锁定拥有者。

更多内容请参考 “服务器端钩子脚本”一节