Posted on Posted in 6.日常使用指南

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

  • 例如,你使用图形文件等“不能合并”的文件。如果两个人修改同一个这样的文件,合并是不可能的,所以你丢失其中一个的修改。

  • Your
    company has always used a locking revision control system in the past
    and there has been a management decision that “locking is best”.

Firstly
 you need to ensure that your Subversion server is upgraded to at least
 version 1.2. Earlier versions do not support locking at all. If you
are  using file:// access, then of course only your client needs to be updated.

锁定在Subverion中是如何工作的

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

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

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

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

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

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

取得锁定

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

图 5.40. 锁定对话框

锁定对话框

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

If you select a folder and then use TortoiseSVN → Get Lock… the lock dialog will open with every file in every
 sub-folder selected for locking. If you really want to lock an entire
 hierarchy, that is the way to do it, but you could become very
unpopular  with your co-workers if you lock them out of the whole
project. Use  with care …

释放锁定

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

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

检查锁定状态

图 5.41. 检查修改对话框

检查修改对话框

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

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

避免破坏和窃取锁定

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

让非锁定的文件变成只读

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

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

如果你管理的策略要求每个文件都必须被锁定,那么你会发现使用Subversion的auto-props功能,在你每次加入新文件的时候,自动设置属性是很方便的。请阅读“TortoiseSVN的设置”一节

锁定钩子脚本

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

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

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

更多内容请参考 “钩子脚本”一节