使用之前在第 2.2.3 节 “复制-修改-合并 方案”中描述的“复制-修改-合并” 的方法,Subversion通常不需要锁就可以很好的工作。但是,在某些情况下你可能需要制定某种锁定策略。
例如,你使用图形文件等“不能合并”的文件。如果两个人修改同一个这样的文件,合并是不可能的,所以你丢失其中一个的修改。
你的公司过去经常使用VCS锁定,这是个管理决定,“锁定是最好的”。
首先,你需要确保你的Subversion服务器更新到至少1.2版本。早期的版本不支持锁定。如果你使用file:///
进行访问,那么当然只要更新你的客户端就可以了。
默认情况下,所有的东西都没有锁定,只要有提交权限的人都可以在任何时候提交任何的文件。其他人会定时更新他们的工作复本,在库中的改变的东西都会与本地合并。
如果你对一个文件 取得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。一个被锁定的文件不能在库中进行任何形式的合并。所以它不能除锁的拥用者之外的人删除或更名。
但是,其他用户不必知道你已经增加了锁定,除非他们定期地检查锁定的状态。这其实没什么意义,因为他们发现提交失败的时候就可以知道锁定了。为了更容易管理锁,而设置了一个新的Subversion属性 svn:needs-lock
。当一个文件的这个属性被设置(成任意值)的时候,每当该文件检出或更新时,本地的复本都被设成只读,除非该工作复本就是拥有锁的那个用户的。这么做是为了能警告你,你不应该修改这个文件,除非你申请到了锁定。受控只读的文件在TortoiseSVN中用一个特殊的图标来表示你需要在编辑前取得锁定。
锁除了按所有者记录外,还在工作复本中记录。如果你有多个工作复本(在家,在单位),那么在这些工作复本中,只允许对其中一份拥有锁。
如果你的合作者之一请求一个锁,但却外出旅游去了,你怎么办?Subversion提供了一种强制锁。释放别人拥有的锁被称为破坏锁定,强制获得别人拥有的锁称为窃取锁定。当然,如果你想要与你的合作者保持良好的关系,轻易不要这么做。
锁在库中进行记录,一个锁定令牌建立在你的本地工作复本中。如果有矛盾,比如某人破坏了锁下,那么本地的锁定令牌将不可用。库中的记录将是最权威的参考。
选择工作复本中你想要获取锁定的文件,然后选择命令
→ .出现一个对话框,允许你输入注释,这样别人可以知道你为什么锁定这个文件。注释是可选的,并且只用于基于Svnserve的库。当(且仅当)你需要窃取别人的锁的时候,勾选偷取此锁定复选框,然后点击 。
如果你选择一个文件夹,使用所有子文件夹中的所有文件 。如果你真的要锁定整个目录,就这么做,但如果你这么做,可能会很不受你的合作者的欢迎。小心使用...
→ 锁定对话框将显示为了确保你不会忘记释放锁,你不需要做别的事,在提交对话框中,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,选中的文件中的锁就被移除了,就算你从没有修改过。如果你不希望释放某文件的锁,你可以取消选中它(如果你没有修改过)。如果你希望保持一个修改过的文件的锁,你需要在提交之前选中保持锁定复选框。
要手动释放锁定,选中工作复本中要释放的文件,选择命令
→ 。不需要输入什么 TortoiseSVN会联系版本库并释放锁。你可以对一个文件夹来使用这个命令释放其中的所有锁定项。要查看你和他人所拥有的锁,你可以使用
→ 命令。本地的锁定令牌会立即显示出来,要查看别人拥用的锁定(或是检查你的锁是否被破坏或窃取)你需要点击 。从此处的右键菜单中,你可以获取锁或是释放锁,也可以破坏或是窃取别人的锁。
避免破坏和窃取锁定 | |
---|---|
如果你在破坏或是窃取某人的锁的时候没有告诉他,你可能会丢掉工作。如果你正在写一个不可合并的文件类型,并且你窃取了某人的锁,一旦你释放了锁,他们就可以随意检入他们的修改以覆盖你的。Subversion并不会丢弃数据,但你却失去了锁带来的对团队工作的保护。 |
正如上面提到的,最有效的使用锁的方式是对一个文件设置svn:needs-lock
属性。参考第 5.15 节 “项目设置”如何设置属性。带有此属性的文件将总被按只读的方式检出和更新(除非你的工作复本拥有锁定)。
作为提醒的方式之一,TortoiseSVN使用一个特殊的图标表示。
如果你管理的策略要求每个文件都必须被锁定,那么你会发现使用Subversion的auto-props功能,在你每次加入新文件的时候,自动设置属性是很方便的。请阅读第 5.27 节 “TortoiseSVN的设置”。
当你使用Suversion1.2或更新的版本建立新的版本库的时候,建立了四个钩子模板在版本库中的hooks
目录下。这些钩子模板在取得/释放一个锁定之前和之后会被分别调用。
安装一个 post-lock
和post-unlock
钩子,在钩子中为锁定和解锁事件发送邮件,是个好主意 。有了这种脚本,你的所有用户都会在一个文件被锁定/解锁的时候被通知。在你的版本库文件夹下,你可以找到一个示例钩子脚本hooks/post-lock.tmpl
。
你可能也使用hooks来拒绝破坏或是窃取锁定,或是限制只有管理员可以,或是当一个用户破坏或窃取锁定时通知原来的锁定拥有者。
更多内容请参考 第 4.3 节 “钩子脚本”