文章目录
一、建立一个 runoob01 的工作目录
所谓的 runoob01 目录其实就是您平常用来存放工作档案的地方。通常我们会等到自己的工作做的一个段落的时候再进行备份。所以我们平常都是在 runoob01 目录下面工作,等到适当时机在 commit 到 repository 中。举例来说,我们想在 F 盘下面建立一个名为 runoob01 的目录。首先先把这个目录建立出来。进入创建的目录在空白处按下右键后,选择 SVN 检出(check out):
弹出对话框如下:
- 版本库URL:https://10.17.102.220/svn/runoob01;我们测试的版本仓库地址,该仓库应已在服务器中存在。
- 检出至目录:我们要将服务器中的项目复制到的目录,默认为当前目录即runoob01目录;
按下确定键后,会提示“检出成功”,并在当前runoob01目录下多出一个**.svn**的目录(注:该目录为隐藏属性)。
二、新增文件及目录到Repository
新建目录Dir01,并在该目录下新建文件file01.txt
右键目录空白处,SVN相关菜单:
- SVN更新(Update):将服务器上repository的最新状态更新到本地;
- SVN提交(commit):将本地修改后的状态提交到服务器上repository中;
这里我们选择SVN提交:
工具会默认提交至对应的repository,我们添加提交的信息,选择提交的文件和文件夹,点击确定按钮:
这时候,可以看到Dir01文件夹前面多了一个蓝色的加号,表示Dir01已经准备添加到repository中(并未真正放到repository中),点击对话框确定按钮后,可以看到Dir01文件夹前面变成了绿色的对号,这时,文件及文件夹才真正放入服务器的Repository中。
三、更新档案及目录(Update)
由于版本控制系统多半都是由许多人共同使用。所以,同样的档案可能还有人会去进行编辑。为了确保您工作目录中的档案与 Repository 中的档案是同步的。建议您在编辑前都先进行更新的动作。
在想要更新的档案或项目目录空白处上面按下鼠标右键。并且选择 SVN 更新(Update)。
如果设定更新的具体版本,可右键选择TortoiseSVN->更新至版本…,选择相应的版本
四、版本冲突及解决
更新提交过程中版本冲突原因:
假设 A、B 两个用户都在版本号为 100 的时候,更新了 file01.txt 这个文件,A 用户在修改完成之后提交 kingtuns.txt 到服务器, 这个时候提交成功,这个时候 file01.txt 文件的版本号已经变成 101 了。同时B用户在版本号为 100 的 file01.txt 文件上作修改, 修改完成之后提交到服务器时,由于不是在当前最新的 101 版本上作的修改,所以导致提交失败。
如Tom修改file01.txt如下:
John修改file01.txt如下:
当John选择SVN提交之后,服务器上的Repository的file01.txt文件已变成了
于是当Tom进行SVN提交时,出现错误,并提示必须先更新工作副本:
注:这时候Tom进行更新时,不会影响Tom对文件的修改内容
Tom更新后,出现提示:
双击红色的冲突位置,弹出比较界面:
上面左边是服务器上file01.txt的最新版本,即John上传的版本,上面右边为Tom修改的版本,在下面已合并的界面上右键,可弹出如下菜单:
- 使用“他们的”文本块:保留John的更改,舍弃Tom的更改;
- 使用“我的”文本块:保留Tom的更改,舍弃John的更改;
- 先使用“我的”文本块:同时保留John和Tom的更改,并将Tom的更改放在前面;
- 先使用“他们的”文本块:同时保留John和Tom的更改,并将John的更改放在前面;
比如,选择“先使用我的文本块”,可以看到已合并界面变成了:
Ctrl+S保存合并修改,弹出对话框,选择标记为解决:
关闭比较界面,在更新界面中可以看到,红色标注的冲突已经变成了黑色的解决字样:
点击确定按钮,会再次弹出提交界面:
添加提交信息后,可点击确定按钮进行提交,至此服务器中的Repository完成了John和Tom基于同一版本的修改后的合并操作。
五、文件锁定与解锁
以上冲突产生的原因是由于多个人同一时间对同一个文件改动的相互覆盖,为了避免这种情况,版本控制系统必须有一套冲突处理机制,一般策略有:乐观加锁、严格加锁
- 乐观加锁:所有签出的文件都是可读写的,对文件的修改不必获得文件的锁,当你修改完文件签入时,会首先要求你更新本地文件,版本控制系统不会覆盖你的本地修改,而是会让你自己合并冲突后签入。
- 严格加锁:所有签出的文件都是只读的,任何对文件的修改必须要获得文件的锁,如果其他人没有拥有该文件的锁,那么版本控制系统就会授权给你文件的锁,并将文件设置为可编辑的。
SVN使用的是乐观加锁策略。相比于严格加锁,乐观加锁可能会有较高的产生冲突的概率,但允许团队成员任何时间对文件进行编辑,拥有极大的协作效率。
5.1 使用TortoiseSVN获取锁和释放锁
SVN默认情况下,所有的文件都没有锁定,只要有提交权限的人都可以在任何时候提交任何的文件。其他人会定时更新他们的工作目录,在库中的改变的东西都会与本地合并。
如果你对一个文件获得锁定,那么只有你可以提交这个文件。其他用户的提交都会被拒绝,直到你释放了这个锁。
获取锁
选择你想要获取锁定的文件或文件夹,然后右键菜单点击TortoiseSVN->获取锁定(Get lock),将会弹出如下锁定窗口,输入对文件加锁的原因,点击确定按钮,即可完成对文件的锁定。
此状态下,如果其他用户对file01.txt修改后提交的话,会出现如下错误:
释放锁
有两种情况会释放锁:
1、选择你想要释放锁定的文件,然后右键菜单点击TortoiseSVN->解除锁定(Release lock);
2、TortoiseSVN为了确保你不会忘记释放锁,在提交对话框中,总是会显示锁定的文件,并总是默认被选中。如果你继续提交,选中的文件中的锁就被移除了,就算你从没有修改过。如果你不希望释放文件的锁,在提交的时候必须勾选“保持锁定”。
存在的问题
使用TortoiseSVN 的“获取锁定(Get lock)”锁定文件后,其他用户并不知道你对这个文件已经锁定,即使他们签出最新的版本,依然能够对文件在本地进行修改,文件依然是可读写的状态,只有当他们在签入时才会发现文件已经被锁定。
因此,在这种加锁操作下,团队成员需要定期的检查文件的锁定状态,可以使用TortoiseSVN -> 检查修改(check for modifications):
5.2 SVN严格加锁
之所以存在被锁定后其他成员依然可以在本地修改,是因为SVN所采取的是乐观加锁的策略。如果我们想对某个文件或某个目录采取严格加锁策略,更明确的说是:所有文件默认为只读,在文件修改前需要先获取锁,只有其他人不拥有锁时才可以锁定文件并修改。
要实现严格加锁,就需要使用SVN的svn:needs-lock属性。
在想要采取严格加锁的文件或目录上点击右键,使用TortoiseSVN->属性(Properties)菜单,点击新建属性,选择需要锁定(Needs-lock):
可以看到此时锁定的文件前变成了灰色的对号,当设置了svn:needs-lock属性时,实际上对文件就采取严格加锁策略,对文件的任何修改都必须先使用TortoiseSVN 的 Get lock锁定文件。
5.3 关于锁的建议
对于项目中的二进制文件,如图片、声音、动态库等,可以在目录上统一设置svn:needs-lock属性,避免在这些文件上产生冲突,浪费解决冲突的时间。