Subversion学习笔记

1 版本控制的基本原理

版本库(Repository): 按照一定格式存储了所有数据,包括文件和目录; 记录每一次改变:每个文件的改变,甚至是目录树本身的改变,例如文件和目录的添加、删除和重新组织。

一个典型的客户/服务器系统:

clip_image002

版本控制最主要是解决数据共享问题:

1.1 需要避免的问题

clip_image004

Harry和Sally,他们想同时编辑版本库里的同一个文件,如果首先Harry保存它的修改,过了一会,Sally可能凑巧用自己的版本覆盖了这些文件,Harry的更改不会永远消失(因为系统记录了每次修改),但Harry所有的修改不会出现在Sally新版本的文件中,所以Harry的工作还是丢失了—至少是从最新的版本中丢失了—而且可能是意外的,这就是我们要明确避免的情况!

1.2 锁定-修改-解锁 方案

clip_image006

在这样的模型里,在一个时间段里版本库的一个文件只允许被一个人修改。首先在修改之前,Harry要“锁定”住这个文件,锁定很像是从图书馆借一本书,如果Harry锁住这个文件,Sally不能做任何修改,如果Sally想请求得到一个锁,版本库会拒绝这个请求。在Harry结束编辑并且放开这个锁之前,她只可以阅读文件。Harry解锁后,就要换班了,Sally得到自己的轮换位置,锁定并且开始编辑这个文件。

1.3 拷贝-修改-合并 方案

clip_image008

clip_image010

在这种模型里,每一个客户联系项目版本库建立一个个人工作拷贝—版本库中文件和目录的本地映射。用户并行工作,修改各自的工作拷贝,最终,各个私有的拷贝合并在一起,成为最终的版本,这种系统通常可以辅助合并操作,但是最终要靠人工去确定正误。

Harry和Sally为同一个项目各自建立了一个工作拷贝,工作是并行的,修改了同一个文件A,Sally首先保存修改到版本库,当Harry想去提交修改的时候,版本库提示文件A已经过期,换句话说,A在他上次更新之后已经更改了,所以当他通过客户端请求合并版本库和他的工作拷贝之后,碰巧Sally的修改和他的不冲突,所以一旦他把所有的修改集成到一起,他可以将工作拷贝保存到版本库。

2 基本概念

2.1 版本库: 是Subversion的核心部分,是数据的中央仓库。

2.2 工作拷贝—版本库中文件和目录的本地映射

2.3 修订版本(revision):

一个svn commit操作可以作为一个原子事务操作发布任意数量文件和目录的修改,在你的工作拷贝里,你可以改变文件内容、删除、改名以及拷贝文件和目录,然后作为一个原子事务一起提交。

每当版本库接受了一个提交,文件系统进入了一个新的状态,叫做一次修订(revision),每一个修订版本被赋予一个独一无二的自然数,一个比一个大,初始修订号是0,只创建了一个空目录,没有任何内容。

2.4 更新和提交分开:

Subversion有一个基本原则就是一个“推”动作不会导致“拉”,反之亦然,因为你准备好了提交你的修改并不意味着你已经准备好了从其他人那里接受修改。如果你的新的修改还在进行,svn update将会优雅的合并版本库的修改到你的工作拷贝,而不会强迫将修改发布。 

2.5 Cleanup

它查找工作拷贝中的所有遗留的日志文件,删除进程中工作拷贝的锁。如果Subversion告诉你工作拷贝中的一部分已经“锁定”了,你就需要运行这个命令了。

2.6 Get Lock & ReleaseLock

锁定-修改-解锁方案

3 安装与基本操作

安装步骤

Ø 服务器端(Setup-Subversion-1.6.13.msi)

Ø 客户端(TortoiseSVN-1.6.7.18415-win32-svn-1.6.9.msi)

Ø Visual Studio 插件(AnkhSvn-2.1.8420.8.msi)

Ø 中文语言包(LanguagePack_1.6.11.20210-win32-zh_CN.msi)

3.1 软件下载

Subversion中文站点:

http://www.subversion.org.cn/

服务器端Subversion下载地址:

http://subversion.apache.org/packages.html

客户端TortoiseSVN和语言包下载地址:

http://tortoisesvn.net/downloads

Visual Studio 插件 AnkhSvn下载地址:

http://ankhsvn.open.collab.net/

3.2 软件安装

按照SubversionàTortoiseSVNàLanguagePackàAnkhSvn依次安装即可;

其中Subversion一般装在服务端机器,其他的装在客户端机器

3.3 建立版本库

运行Subversion服务器需要首先要建立一个版本库(Repository),可以看作服务器上存放数据的数据库,在安装了Subversion服务器之后,可以直接运行,如:

svnadmin create E:\svndemo\repository

就会在目录E:\svndemo\repository下创建一个版本库。

我们也可以使用TortoiseSVN图形化的完成这一步:

在目录E:\svndemo\repository下"右键->TortoiseSVN->Create Repository here...“, 然后可以选择版本库模式, 这里使用默认即可, 然后就创建了一系列目录和文件。

3.3.1 多个软件项目解决方案:

在server端,新建一个目录用来存放所有的仓库。比如c:\svnrepos。然后在这个目录下建立每个项目独立的仓库。

3v/V"jF U0svnadmin create "c:\svnrepos\rolex"

+@ Z;} m R%f [0svnadmin create "c:\svnrepos\omega"

] y"[ M3R0

"Q3V ~ n u$G H g0使用 svnserve -d -r "c:\svnrepos" 启动。这样你的项目的url是:

&u W E9] h T0svn://IP/rolex

D!m6Z2C u L f3e0svn://IP/omega

3.4 配置用户和权限

来到E:\svndemo\repository\conf目录,修改svnserve.conf:

# [general]

# password-db = passwd

改为:

[general]

password-db = passwd

然后修改同目录的passwd文件,去掉下面三行的注释:

# [users]

# harry = harryssecret

# sally = sallyssecret

最后变成:

[users]

harry = harryssecret

sally = sallyssecret

在passwd文件中,“=”前的字符就是用户名,后面的就是密码。还要注意“[users]”前面的注释“#”一定要删除掉。

3.5 运行独立服务器

在任意目录下运行:

svnserve -d -r E:\svndemo\repository 我们的服务器程序就已经启动了。注意不要关闭命令行窗口,关闭窗口也会把svnserve停止。

有关服务器自动开机运行服务详见附件1

3.6 初始化导入

来到我们想要导入的项目根目录,在这个例子里是E:\svndemo\initproject,目录下有一个readme.txt文件:

右键->TortoiseSVN->Import...

在URL of repository输入“svn://localhost/trunk”

在Import Message中输入你的日志信息

完成之后目录没有任何变化,如果没有报错,数据就已经全部导入到了我们刚才定义的版本库中。

需要注意的是,这一步操作可以完全在另一台安装了TortoiseSVN的主机上进行。例如运行svnserve的主机的IP是133.96.121.22,则URL部分输入的内容就是“svn://133.96.121.22/trunk”。

3.7 基本客户端操作

3.7.1 取出版本库到一个工作拷贝:

来到任意空目录下,在本例中是E:\svndemo\wc1,运行右键->Checkout,在URL of repository中输入svn://localhost/trunk,这样我们就得到了一份工作拷贝。

3.7.2 在工作拷贝中作出修改并提交:

打开readme.txt,作出修改,然后右键->Commit...,这样我们就把修改提交到了版本库,我们可以运行。

3.7.3 察看所作的修改:

readme.txt上右键->TortoiseSVN->Show Log,这样我们就可以看到我们对这个文件所有的提交。在版本1上右键->Compare with working copy,我们可以比较工作拷贝的文件和版本1的区别。

4 Svn冲突解决

冲突:但是如果Sally和Harry的修改交迭了该怎么办?这种情况叫做冲突,这通常不是个大问题,当Harry告诉他的客户端去合并版本库的最新修改到自己的工作拷贝时,他的文件A就会处于冲突状态:他可以看到一对冲突的修改集,并手工的选择保留一组修改。需要注意的是软件不能自动的解决冲突,只有人可以理解并作出智能的选择,一旦Harry手工的解决了冲突—也许需要与Sally讨论—它可以安全的把合并的文件保存到版本库。

此时文件在工作目录和版本库都得到修改。一个svn commit将会失败,这个文件必须首先更新,svn update命令会合并公共和本地修改,如果Subversion不可以自动完成,将会让用户解决冲突。

如果你遇到冲突,三件事你可以选择:

“手动”合并冲突文本(检查和修改文件中的冲突标志)。(先update—手动修改文件--resolved)

用某一个临时文件覆盖你的工作文件。

运行svn revert <filename>来放弃所有的本地修改。

附件1

Windows实现SVN服务开机自启动:

sc create MySVNServer binpath= "\"C:\Program Files\Subversion\bin\svnserve\" --service -r D:\detail.lee\svnrepos" displayname= "SVNService" depend= Tcpip start= auto

注意之处:

  (1)sc是windows自带的服务配置程序,MySVNServer 是服务的名称,似乎没什么用。

  (2)参数binPath表示svnserve可执行文件的安装路径,由于路径中的"Program Files"带有空格,因此整个路径需要用双引号引起来。而双引号本身是个特殊字符,需要进行转移,因此在路径前后的两个双引号都需要写成\" 。

  (3)--service参数表示以windows服务的形式运行,--r指明svn repository的位置,service参数与r参数都作为binPath的一部分,因此与svnserve.exe的路径一起被包含在一对双引号当中,而这对双引号不需要进行转义。

  (4)displayname表示在windows服务列表中显示的名字, depend =Tcpip 表示svnserve服务的运行需要tcpip服务,start=auto表示开机后自动运行。安装服务后,svnserve要等下次开机时才会自动运行。

  (5)binPath的等号前面无空格,等号后面有空格 displayname depend start也都一样 service前面是--,不是- ,而r前面是-

  (6)若要卸载svn服务,则执行 sc delete svnserve 即可。

  (7)从“sc”到“auto”是在同一个命令sc,必须写在同一行。 创建成功后,可以在运行中键入service.msc察看系统服务,找到SVNService项,查看这项服务的属性,可以使用Windows提供的界面操作SVNService服务了。

  也可以使用命令行启动、停止服务。

  启动服务: C:\>net start svnservice SVNService 服务正在启动 . SVNService 服务已经启动成功。

  停止服务: C:\>net stop svnservice SVNService 服务正在停止. SVNService 服务已成功停止。

  删除创建的服务 C:\>sc delete svn svnservice

参考:http://www.subversion.org.cn/

 

 

 

Detail.lee

2010.10.22

福建省空间信息工程研究中心

posted on 2010-10-22 19:50  SIRC_Detaillee  阅读(344)  评论(0编辑  收藏  举报