硬广:《SVN与TortoiseSVN实战》系列已经写了八篇,本篇是完结篇,整个系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解,以技巧性为主。

本篇详解使用TortoiseSVN对文件进行加锁和解锁的技巧,其中涉及到了之前介绍的SVN属性知识,关于属性可以翻看《SVN与TortoiseSVN实战:属性的奇技淫巧(一)》、《SVN与TortoiseSVN实战:属性的奇技淫巧(二)》。

加锁与解锁的操作对于项目中的二进制文件,如图片、声音、动态库等不可合并文件是非常有用的,可以让这些文件防止产生恼人的冲突,但TortoiseSVN中的Get lock的其实并不能满足需要,并不能在编辑前获得对文件的独占访问,这也是本文要结合属性来详解文件加锁的原因。

本篇内容概要:

1、版本控制系统的加锁策略:乐观加锁、严格加锁;

2、使用TortoiseSVN获取锁和释放锁;

3、使用属性,将文件设置为只读;

4、关于锁的建议;

1、版本控制系统的加锁策略:乐观加锁、严格加锁


为了避免多个人同一时间对同一个文件改动的相互覆盖,版本控制系统就必须有一套冲突处理机制。

对于解决冲突,有两种处理办法:乐观加锁和严格加锁。

严格加锁:所有签出的文件都是只读的,任何对文件的修改必须要获得文件的锁,如果其他人没有拥有该文件的锁,那么版本控制系统就会授权给你文件的锁,并将文件设置为可编辑的。

乐观加锁:所有签出的文件都是可读写的,对文件的修改不必获得文件的锁,当你修改完文件签入时,会首先要求你更新本地文件,版本控制系统不会覆盖你的本地修改,而是会让你自己合并冲突后签入。

SVN使用的是乐观加锁策略,而像TFS一类的版本控制系统允许你对加锁策略进行选择。

相比于严格加锁,乐观加锁可能会有较高的产生冲突的概率,但允许团队成员任何时间对文件进行编辑,拥有极大的协作效率。

对于像不可合并的二进制文件或想在某些文件和目录上采取严格加锁策略,SVN也提供了严格加锁的办法,就是对文件的加锁解锁操作。

2、使用TortoiseSVN获取锁和释放锁;


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

如果你对一个文件获得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。

获取锁:

选择你想要获取锁定的文件,然后右键菜单点击TortoiseSVN Get lock,将会弹出锁定窗口:

一个良好的习惯是每次获取锁定时,在红色标注位置输入获取锁的原因。

释放锁:

有两种情况会释放锁:

1、选择你想要释放锁定的文件,然后右键菜单点击TortoiseSVN Release lock;

2、TortoiseSVN为了确保你不会忘记释放锁,在提交对话框中,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,选中的文件中的锁就被移除了,就算你从没有修改过。可以在锁定文件的目录上使用Commit,打开提交对话框验证一下。

如果你不希望释放文件的锁,就必须取消选中它。

问题是什么?

如果实际操作过,使用过TortoiseSVN 的 Get lock来加锁,就会发现并不如你所预期的,对文件实现了严格加锁,本篇也就不必要写了。

问题在哪?使用TortoiseSVN 的 Get lock锁定文件后,其他用户并不知道你对这个文件已经锁定,即时他们签出最新的版本,依然能够对文件在本地进行修改,文件依然是可读写的状态。

这是一个在其他成员电脑上已经Get lock的文件,可以看到与其他文件在状态上没有任何区别:

这样其实是没有意义的,别人依然会对你锁定的文件进行修改,只有当他们在签入时才会发现文件已经被锁定:

这种加锁操作下,团队成员需要定期的检查文件的锁定状态,可以使用TortoiseSVN的check for modifications:

3、使用属性,将文件设置为只读;


之所以存在被锁定后其他成员依然可以在本地修改,是因为SVN所采取的是乐观加锁的策略。

如果我们想对某个文件或某个目录采取严格加锁策略,更明确的说是:所有文件默认为只读,在文件修改前需要先获取锁,只有其他人不拥有锁时才可以锁定文件并修改。

要实现严格加锁,就需要使用SVN的svn:needs-lock属性。

在想要采取严格加锁的文件或目录上点击右键,使用TortoiseSVN Properties属性菜单,点击News新建属性,选择Needs-lock:

设置为Locking required,签入属性修改操作,可以发现文件的图标状态改变了,并变为只读:

当设置了svn:needs-lock属性时,实际上对文件就采取严格加锁策略,对文件的任何修改都必须先使用TortoiseSVN 的 Get lock锁定文件。

4、关于锁的建议


对于项目中的二进制文件,如图片、声音、动态库等,可以在目录上统一设置svn:needs-lock属性,避免在这些文件上产生冲突,浪费解决冲突的时间。

结语:本系列一共九篇,对SVN中的技巧基本上进行了全面的介绍,希望对大家有所帮助。如果想要系统的学习SVN,可以阅读《版本控制之道》这本书,本系列所讲的内容与书中的内容并不完全重复,更侧重于实战性和技巧性的内容,最后希望大家在项目开发中能正确、合理运用SVN。

SVN与TortoiseSVN实战:文件加锁详解的更多相关文章

  1. SVN与TortoiseSVN实战:补丁详解

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  2. SVN与TortoiseSVN实战:补丁详解(转)

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  3. SVN与TortoiseSVN实战:冲突详解(二)

    硬广:<SVN与TortoiseSVN实战>系列已经写了四篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  4. SVN与TortoiseSVN实战:冲突详解(一)

    硬广:<SVN与TortoiseSVN实战>系列已经写了三篇,第一篇<SVN与TortoiseSVN实战:从入门到精通>,第二篇<SVN与TortoiseSVN实战:标签 ...

  5. SVN与TortoiseSVN实战:属性的奇技淫巧(二)

    硬广:<SVN与TortoiseSVN实战>系列已经写了七篇,本系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解. 关于属性的奇技淫巧较多,分为两篇来写,第一篇详见< ...

  6. SVN与TortoiseSVN实战:属性的奇技淫巧(一)

    硬广:<SVN与TortoiseSVN实战>系列已经写了六篇,本系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解,预计再用三.四篇来结束这个系列. 本篇详解一下SVN的属 ...

  7. SVN与TortoiseSVN实战:从入门到精通

    SVN,版本控制程序,是支撑项目开发的基础工具. 在团队开发中,不管是程序员还是美工.测试等人员,都会用到SVN,通常会把SVN视为源代码管理工具,但对于SVN更准确的理解是: “帮助参与项目人员的管 ...

  8. 史上最全的maven pom.xml文件教程详解

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. SVN与TortoiseSVN实战:TortoiseSVN新建及合并分支

    硬广:<SVN与TortoiseSVN实战>系列已经写了两篇,第一篇<SVN与TortoiseSVN实战:从入门到精通>,关于分支和标签的知识介绍可翻阅第二篇<SVN与T ...

随机推荐

  1. Exception error message with incorrect line number

    In Release mode the number in front of the exception is NOT the line of code. Instead it's an offset ...

  2. C#数字千分位问题

    1.C#中用最简单的方法把数字(不含小数)转换为千分位格式:     如1234567变成1,234,567 方法:1234567.ToString("###,###")   或  ...

  3. OAF_VO系列3 - Binding Style绑定方式

    在OAF VO开发中,Binding Style主要用于对VO的where clause做动态传值,总共有三种方式 1.       Oracle Named 2.       Oracle Posi ...

  4. Codeforces Round #365 (Div. 2) Mishka and trip

    Mishka and trip 题意: 有n个城市,第i个城市与第i+1个城市相连,他们边的权值等于i的美丽度*i+1的美丽度,有k个首都城市,一个首都城市与每个城市都相连,求所有边的权值. 题解: ...

  5. Mongodb(3)插入文档,更新文档,删除文档

    insert() 方法 要插入数据到 MongoDB 集合,需要使用 MongoDB 的  insert() 或 save() 方法. 插入文档:db.COLLECTION_NAME.insert(d ...

  6. 转-Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

    http://www.cnblogs.com/lichenwei/p/3985121.html 记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果, ...

  7. C++ 局部变量的析构

    http://blog.chinaunix.net/uid-52437-id-2108747.html 在一个函数内,申明一个局部类变量.则这个变量什么时候析构呢? 并不是在函数退出,释放栈空间时候析 ...

  8. 定时任务 Crontab命令 详解

    crontab是Unix和Linux用于设置周期性被执行的指令,是互联网很常用的技术,很多任务都会设置在crontab循环执行,如果不使用 crontab,那么任务就是常驻程序,这对你的程序要求比较高 ...

  9. 各式 Web 前端開發工具整理

    程式碼編寫工具 (Coding Tools) 工作流程/建置/組合 (Workflow/Builds/Assemblers) lumbar brunch grunt lineman yeoman Ta ...

  10. AIX 下某些日志定时清空

    最近发现weblogic proxy日志一直增加,达到18G把tmp空间撑满,导致系统无法访问,故设定时任务先拷贝后5000行日志做备份后清空proxy日志. vi wl_proxyclear.sh ...