【svn】解析subversion的使用
目录结构:
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。
先列出笔者的环境:
SVN服务端(VisualSVN-Server)版本:3.6.0
SVN客户端(TortoiseSVN)版本:1.8.10
运行环境:Window7 X64
TortoiseSVN1.8.10 集成了客户端和服务端的功能,如果是在本机测试的话,就只需要装这个软件就可以了。如果需要单独搭建SVN服务器的话,那么建议在服务器上装VisualSVN-Server版本。
1,安装客户端
将资源下载好以后,点击TortoiseSVN进入安装页面,这里笔者将客户端安装到了: D:\workSoftware\exe\install\TortoiseSVN\localSVN\installPacakage
2,安装服务端
客户端安装好了以后,我们就来安装服务端,双击打开:Subversion,这里笔者将地址安装到了 D:\workSoftware\exe\install\TortoiseSVN\serverSVN\InstallPackage
3,创建仓库
这个仓库是服务端存放数据的地方,笔者在 D:\workSoftware\exe\install\TortoiseSVN\serverSVN\data\ 的目录下建立了仓库 projectManage ,方法为在dos窗口中输入svnadmin create 仓库地址,笔者就需要打开dos窗口,输入 svnadmin create D:\workSoftware\exe\install\TortoiseSVN\serverSVN\data\projectManage
,仓库创建好后,在该目录下会生成一些文件。
4,启动仓库
创建好仓库后,就需要启动仓库,方法为在dos窗口中输入svnserve -d -r 仓库地址,比如笔者的 svnserve -d -r D:\workSoftware\exe\install\TortoiseSVN\serverSVN\data\projectManage
这个窗口不要关闭。如果下一次,需要传输文件,也需要把这个再次这样启动,或者也可以配置成为自动启动。
5,创建客户端与仓库取得联系
在本地新建两个文件夹,user1和user2,分别代表本地两个不同的用户。
进入这两个文件夹,分别右击 检出 -> svn://IP ,这个时候在这个文件夹里面会有一个隐藏的.svn文件夹。
6,使用svn服务
在上面建立的user1文件夹下面,建立新文件,比如HelloWorld.java.
然后选中该文件,右击-> add -> add(表示本地.svn对该文件形成管理)
然后再 右击->commit,这里需要注意,如果是首次提交会因为没有权限而错误。进入到仓库的文件夹下面,笔者的就是projectManage文件夹,找到conf文件夹里面的svnserve.conf文件,把里面的anon-access改为write.
7,SVN密码管理
在上面第6点中,我们把anon-access取消了注释,并且把的值改为了write。这样的话所有的非验证用户都拥用读写仓库的权限,在团队管理中,这显然是不安全的。接下来笔者将会讲解一下,仓库(respository)下文件夹conf下的每个文件的作用。以及如何给每个用户分配权限。
在创建完成仓库后,conf文件夹下有4个文件,分别是authz、hooks-env.tmpl、passwd和svnserve.conf文件。
svnserve.conf文件的部分内容在第6点中,已经贴出了部分。下面来完整的讲解一下这些文件:
svnserve.conf控制着svnserve进程的配置信息。svnserve.conf大致包含如下信息:
[general]
#anon-access = read
#auth-access = write
#password-db = passwd
#authz-db = authz
#groups-db = groups
#realm = My First Repository
#force-username-case = none
#hooks-env = hooks-env
[sasl]
#use-sasl = true
#min-encryption = 0
#max-encryption = 256
这些值默认都是被注释的,下面笔者列举其中几项:
anon-access 控制非鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。即"write"为可读可写,"read"为只读,"none"表示无访问权限。缺省值:read。
auth-access 控制鉴权用户访问版本库的权限。取值范围为"write"、"read"和"none"。即"write"为可读可写,"read"为只读,"none"表示无访问权限。缺省值:write。
password-db 指定用户名口令文件名。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。在有些版本该缺省值是"passwd",但在笔者的版本中,并没有提及。
authz-db 指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。除非指定绝对路径,否则文件位置为相对conf目录的相对路径。在有些版本该缺省值是"authz",但在笔者的版本中,并没有提及。
realm 指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件。缺省值:一个UUID(Universal Unique IDentifier,全局唯一标示)。
force-username-case 指定是否进行强制大小写字符转化,"upper"、"lower"和"none"。缺省值是"none"。
hooks-env 指定环境配置文件
这里讲解一下realm作用,在使用svn客户端访问svnserve服务器时,若需要用户登录,则提示信息如下:
Authentication realm: <svn://192.168.0.141:3690> 8c147aa4-598e-d649-a1e9-e7e8f4edf2c3 Password for 'harry':
在上述第1行"Authentication realm: <svn://192.168.0.141:3690>"之后显示的字符串为认证域名称。如果在配置文件中为设定认证域,就会提示一个UUID,如上述所示。
如果在配置文件配置如下信息:
realm = test
那么svn客户端在访问svnserve服务器时,需要登录的提示信息如下:
Authentication realm: <svn://192.168.0.141:3690> test Password for 'harry':
realm信息就替换成了test,如上所示。
passwd是svnserve的一个密码文件示例。笔者的passwd文件默认内容如下:
[users]
#harry = harryssecret
#sally = sallyssecret
authz是svnserve的一个授权文件示例。笔者的authz文件默认内容如下:
[aliases] # joe = /C=XZ/ST=Dessert/L=Snake City/O=Snake Oil, Ltd./OU=Research Institute/CN=Joe Average [groups] # harry_and_sally = harry,sally # harry_sally_and_joe = harry,sally,&joe # [/foo/bar] # harry = rw # &joe = r # * = # [repository:/baz/fuz] # @harry_and_sally = rw # * = r
下面的配置可以帮助理解这些节点的含义:
[group]
admin = aaa,bbb,ccc
vip = a1
man = b1
custom = c1 //这里先设定有这么多个角色和用户
//假设库的名字叫cp
//下面在cp下建立2个平行的目录vip和main
[/]
@admin=rw //表示根目录下只有admin才有读写权限
[cp:/]
*=r //在cp库下,除了admin下,所有人都有读的权限
@admin=rw //在cp库下,admin具有读写的权限
[cp:/vip]
*= //除了vip和admin之外,所有人没有任何权限
@vip=rw //
@admin=rw //
[cp:/main]
*= //除了以下角色外,其他人没有任何权限
@admin=rw //
@vip=rw //
@man=r //
实际的案例文件中还生成了许多注释信息,读取可以详细许多你们仓库中conf文件夹下的各个文件的的注释信息。
接下来贴一下,能够进行密码控制的配置文件,和演示:
svnserve.conf文件中[general]节点:
[general]
anon-access = read
auth-access = write
password-db = passwd
authz-db = authz
passwd文件中[user]节点:
[users]
harry = harryssecret
authz文件末尾加上:
[/]
harry = rw
这样配置的话,harry用户就对仓库根目录([/])有读写权限了。
下面笔者通过dos命名来展示一下:
svn checkout svn://192.168.0.141
echo null > a.txt
svn add *
svn commit * -m testfile --username harry --password harryssecret
有什么问题,可以通过svn help ...查看帮助信息。
除了可以通过DOS命令输入密码,还可以在客户端通过右键在SVN连接中提供的工具进行连接,在必要的阶段也会提示你输入密码,在弹出的命令框中输入svn地址进行连接。如果没有弹出密码提示框,那么可以删除 C:\Users\Administrator\AppData\Roaming\Subversion\auth 目录下的所有文件。
在上面的配置文件中,我们配置了anon-access = read,这就是说所有人都可以查看仓库的内容(无需验证),如果只想要有授权的人才可以读取和修改仓库的内容的话,可以改为anon-access = none。
8.SVN的仓库布局和常规命令
每一个仓库的布局方式都应该按照
项目 ->
branches
tags
trunk
如果只有一个项目的话,那么就可以省略项目文件夹。
例如:
$ svn list file:///var/svn/single-project-repo
trunk/
branches/
tags/
$ svn list file:///var/svn/multi-project-repo
project-A/
project-B/
$ svn list file:///var/svn/multi-project-repo/project-A
trunk/
branches/
tags/
可以结合第7点中权限分配那一节,对不同的文件夹赋予不同的用户权限。
下面是一些关于SVN服务的常见操作
svn mkdir 地址/文件夹名称 #在目标地址下创建指定文件夹
svn list 地址 #显示地址下的文件信息
svn copy 地址1 地址2
svn checkout 地址 #检出
svn add 文件 #添加到本地
svn update 文件 #更新
svn commit -m 描述信息 #提交
...
输入svn help查看更多信息
解释一下update和commit的区别:
提交(commit):是用本地文件覆盖服务器的文件,只有提交会导致服务器上发生变化
更新(update):只是把服务器上最新版本下载到客户端,规则如下:
1、如果你本地的某个文件没有修改过,而服务器上的这个文件别人已经提交过新版本,那么会用服务器上最新的文件覆盖你本地的文件;
2、如果你本地的某个文件你修改过了还没有提交,服务器端的这个文件还没被别人改过,那么对你本地的这个文件没有任何影响;
3、如果你本地的某个文件你修改过了还没有提交,服务器端的这个文件已经被别人改过,那么会提示你发生冲突,会将服务器上最新版文件、你新修改的文件、发生分歧前的那个版本的文件都存放到你的本地
建议:在commit之前,先进行update操作。
9.分支、合并和标签
接下笔者要讲解一下SVN中的分支(branch)、合并(merge)和标签(tag)。在上面的第8节中,我们讨论过一个标准的项目目录下,应该要有branches、trunk和tags三个文件夹。这三个目录就对应了这一节要讲的知识。
在项目开发中,不同的项目组需要进行分工开发,最后将所有的代码合并起来,组成一个完整的项目。
如图:
所有的这些分支(branch)最开始都是从主干(trunk)拷贝而来的,当这些分支完成某一个阶段的任务后,就可以向主干进行合并。(注:svn几乎所有的操作都是联网的,这与Git不同)
如何创建分支(branch)?
分支最开始就是主干的拷贝体,所以可以通过svn copy命令创建分支:
svn copy 地址1 地址2 -m 注释
其中地址1就是拷贝的源地址,地址2就是拷贝的目标地址。
SVN客户端提供图形化界面的操作方式:
在To path一栏,选择要创建的路径,该路径之前是不应该存在的。
在创建好分支后,就可以通过分支仓库来开发代码,等主干需要合并分支代码时(或相反),就可以通过merge来完成。
SVN客户端同样提供了图形化界面的操作方式:
在主干的仓库下,合并我们刚才创建好的分支
选择需要合并的分支。
如果主干需要创建当前文档的备份信息,那么可以创建一个标签(tag)。标签同样也是文档的拷贝体,所以也可以通过svn copy来创建其标签,svn copy的具体语法笔者就不再赘述了。
SVN客户端同样提供了创建标签的图形化界面:
分支和主干的概念是相对的,父分支也是子分支的主干,合并同理。标签不是只能用于主干,而且可以用于任何有权限能够创建备份的地方。