第一章 SVN中的权限管理与Import和Checkout详解
导言:
什么是版本控制?当在公司中写了一天的代码,这时到了下班时才发现最终版的代码并不是与业务需求相辅,这时想还原到上午10点的代码版本,如果出现这样的情况,那基本是从新更改代码,而工作量可想而知。即使在上午10点有一个源代码的备份也只能免于一时的麻烦,那如果想还原到一天之前,一个周之前,一个月之前的代码版本呢?难道要将每一天存放源代码的文件夹进行复制备份?这是一个办法,但硬盘空间的占有率将是非常的大。再举一例,一个软件项目大约有10个程序员来合作开发,当软件出现错误时是需要找到指定源代码的设计人来进行更改,或找到某一段代码是由谁来进行设计的,所以必须要有一个记录的机制来统计上面出现情况的信息,要记录源代码历史的情况或跟踪程序员代码的痕迹,那么就要使用到版本控制。
什么是SVN(subversion)?SVN是软件开发业内主流的版本控制软件,它是以CMD命令行为基础的服务组件,通过使用命令行的方式来对硬盘中指定文件夹中的源代码进行管理,支持权限,合并,分支,标记等版本控制前沿的功能,大多数的软件公司都有接触过SVN版本控制软件。版本控制软件较常用的有VSS和CVS及SVN,但VSS和CVS这两款软件已经在业内被淘汰,因为它们工作的方式在现阶段软件公司中已经不再适合,所以SVN软件以强大的软件功能,支持并发的软件开发方法大大提高软件公司的工作效率,所以SVN软件在最近几年以火热的程度越来越被IT行业所接受。
什么是TortoiseSVN?TortoiseSVN是基于SVN服务的GUI图形用户界面,如果用原生的SVN服务管理源代码,则必须用命令行的方式,这样在管理源代码的效率上会大打折扣,开发效率非常的慢!所以为了弥补这样的情况,TortoiseSVN应运而出,解决的就是提高SVN管理源代码的效率,大大加快软件源代码的管理,而且它还支持以单机/服务器端-客户端的方式进行管理文件,此软件运行非常稳定,已经将SVN主要的功能在菜单或窗口中以点鼠标结合可视化操作的方式进行实现,使用它的人群有文字管理者,编辑,程序员,设计人员等,泛涉及版本控制就会出现SVN的影子,而有SVN的地方就有TortoiseSVN的出现,可见掌握TortoiseSVN软件是掌握SVN中的重中之重。
-
- 安装SVN服务端与客户端
SVN软件分为服务端与客户端,本教程使用TortoiseSVN软件做为客户端。
SVN软件支持多种操作系统,本教程的案例是在Windows操作系统上进行演示。
需要说明的是,在Windows中单独安装TortoiseSVN也可以实现版本控制,但在安全性和使用方便性上不如使用支持http协议的SVN版本控制,如果使用http协议的SVN版本控制,则需要配置Apache服务器(安装新版SVN服务端时可以自动配置Apache服务器),也就是将SVN服务端与Apache服务器进行整合,从而可以实现以http协议的方式对远程的SVN服务器进行访问。
在后面的章节中将Server服务端和Client客户端一起进行安装。
1.1.1 安装Server服务端
Step01:到官方网站下载CollabNetSubversion-server-1.7.9-1-Win32.exe文件,双击该exe文件弹出如图1.1所示的界面。
图1.1 欢迎安装界面
Step02:单击“Next”按钮继续安装,出现如图1.2所示界面。
图1.2 可以获取最新版
Step03:由于此版本在当前时间里已经是最新版,所以单击“Next”按钮继续安装,出现如图1.3界面。
图1.3 安装模块的选择
如果想使用http协议进行版本控制,则必须安装Apache组件,SVN服务器需要使用Apache服务器作为http协议的支撑,所以2个模块都安装。
使用http协议管理版本控制的优点是有Internet的地方就可以访问SVN服务器。
Step04:单击“Next”按钮继续安装,出现如图1.4所示界面。
图1.4 配置SVN端口及仓库路径
SVN使用默认的端口3690,仓库Repository的概念就是在硬盘中指定一个文件夹路径,在此文件夹中去管理源代码,下方的checkbox选项允许将SVN服务安装到Windows的Service服务列表中。
Step05:单击“Next”继续安装,出现如图1.5所示界面。
图1.5 设置Apache服务器的端口
为了防止80端口早已被占用而导致Apache服务器启动报错,所以将Apache的端口改成7070。还要将C:\svn_repository路径配置进Apache服务器中,以使Apache服务器启动时找到仓库并允许用http协议对仓库进行访问。
其实在安装SVN服务端时配置Apache服务器可以让使用者通过http协议以远程的方式对SVN仓库进行操作处理。
Step06:单击“Next”按钮继续安装,出现如图1.6所示界面。
图1.6 设置SVN服务端安装路径
Step07:选定安装目标文件夹后单击“Install”按钮开始安装,安装结束后弹出图1.7所示界面。
图1.7 配置是否自动升级
Step08:单击“Next”按钮出现安装成功界面如图1.8所示。
图1.8 安装成功
1.1.2 安装Client客户端
Step01:下载TortoiseSVN-1.7.12.24070-win32-svn-1.7.9.msi安装文件,双击进行安装,出现如图1.9所示界面。
图1.9 进入欢迎安装界面
Step02:单击“Next”按钮继续安装,出现如图1.10所示界面。
图1.10 接受授权许可
Step03:单击“Next”按钮继续安装,出现如图1.11所示界面。
图1.11 配置安装模块及选定安装路径
Step04:单击“Next”按钮继续安装,出现如图1.12所示。
图1.12 准备安装
Step05:单击“Install”按钮开始安装,安装结束后弹出图1.13所示界面。
图1.13 安装成功
至此,SVN服务端与客户端安装完毕,后面的章节开始使用它提供的功能。
-
- SVN基本操作与匿名用户的权限设置
源代码的管理主要就是checkin与checkout,也就是源代码的存入与取出,在本章中将会详细的介绍SVN中的Checkout及Import操作,而且还会详细介绍在SVN服务器中的权限配置。
1.2.1 创建Repository仓库
Step01:创建如图1.14所示的文件夹结构。
图1.14 创建文件夹
之所以要在C:\svn_repository路径中创建ghyProject1文件夹,是因为在安装SVN服务端时已经在配置Apache模块中将路径C:\svn_repository设置为仓库的根目录,当然此目录也是SVN服务找到代码仓库的位置。
Step02:在ghyProject1文件夹中单击创建仓库菜单如图1.15所示。
图1.15 单击Create Repository here菜单
Step03:弹出界面并单击如图1.16所示的按钮。
图1.16 单击Create folder structure按钮
Step04:单击“Create folder structure”按钮的目的是在ghyProject1文件夹中添加一些SVN仓库必要的文件夹,这些文件夹主要的作用就是存储不同阶段的项目源代码,单击“Create folder structure”按钮后弹出如图1.17所示界面。
图1.17 成功创建repository仓库
至此在Windows系统中创建了1个名称为ghyProject1的SVN仓库,而文件夹ghyProject1的图标也发生了变化,如图1.18所示。
图1.18 文件夹图标发生变化
1.2.2 重启Apache和Subversion服务
编辑完成后将2个Service启动,如图1.19所示。
图1.19 启动2个服务
1.2.3 使用http和本地Local方式访问ghyProject1仓库
Step01:为了验证仓库可以用http协议进行访问,输入网址:
http://localhost:7070/svn/ghyProject1/
IE显示界面如图1.20所示。
图1.20 http协议可以访问
Step02:不用http协议查看本地SVN仓库的操作如图1.21所示。
图1.21 单击菜单Repo-browser
弹出界面如图1.22所示。
图1.22 访问本地SVN仓库
通过上面的操作步骤可以发现,在默认的情况下以匿名的方式可以对仓库ghyProject1进行读操作,那在默认的情况下可以不可以进行写操作呢?
1.2.4 向ghyProject1仓库中添加空文本及配置匿名用户权限
Step01:在桌面中创建txt文件夹,再添加1个空的txt文件,如图1.23所示。
图1.23 在txt文件夹创建1.txt空文件
Step02:使用菜单Import向ghyProject1仓库进行导入,如图1.24所示。
图1.24 单击Import导入到仓库
Step03:弹出界面如图1.25所示。
图1.25 输入ghyProject1的仓库URL地址并加备注
Step04:单击“OK”按钮显示界面如图1.26所示。
图1.26 成功导入1个空的1.txt文件
Step05:在IE上执行网址:
http://localhost:7070/svn/ghyProject1/
可以看到1.txt已经在仓库中,如图1.27所示。
图1.27 成功添加到仓库中
经过上面的步骤还可以发现,在默认的情况下,使用http://协议匿名用户不仅可以进行读操作,还可以进行写操作,但如果用svn://协议却不能进行写操作,出现没有权限的异常。那如果不想让使用http://协议的匿名用户拥有写操作,而只拥有读操作的权限该如何设置呢?
Step06:进入SVN服务端软件的安装文件夹:
CollabNet\Subversion Server\httpd\conf
编辑其中的httpd.conf文件的主要作用就是配置基于http://协议用户访问的权限,由于在安装SVN服务端的过程中已经对Apache的模块进行了配置,所以在httpd.conf文件的结尾会出现如图1.28所示的配置代码。
图1.28 指定C:\svn_repository为仓库根目录
更改配置如下:
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require Valid-user
</LimitExcept>
</Location>
如上配置将使匿名用户拥有读的权限没有写权限。
Step07:重启2个服务如图1.29所示。
图1.29 重启2个服务
Step08:在桌面创建文件夹wrongtxt和wrongtxt.txt空文件如图1.30所示。
图1.30 创建wrongtxt文件夹和wrongtxt.txt空文件
Step09:对wrongtxt文件夹执行Import操作,如图1.31所示。
图1.31 将文件夹wrongtxt中的内容进行Import操作
Step10:单击OK按钮后的效果如图1.32所示。
图1.32 出现错误无权限
如果出现异常就说明正确了,因为已经限制匿名用户不拥有写的权限。
Step11:如果想查看详细的出错信息,可以在安装SVN服务端软件的路径CollabNet\Subversion Server\httpd\logs中有error.log日志文件,在最后出现验证失败信息如下:
[client 127.0.0.1] configuration error: couldn't perform authentication. AuthType not set!: /svn/ghyProject1/!svn/me
如果使用svn://协议操作仓库的日志是保存在C:\Documents and Settings\class\Application Data\TortoiseSVN\logfile.txt文件中。
上面的步骤屏蔽了匿名用户的写操作。
下面的章节还是使用匿名用户进行读操作,也就是Checkout。
1.2.5 从ghyProject1仓库中checkout文本文件
虽然在IE中可以浏览SVN服务端仓库中的文件,但查看文件,编辑文件和管理文件还是不太方便,所以在本小节中将演示如何从仓库中提取文件到本地。
Step01:在桌面上新创建1个空的文件夹newtxt,单击菜单如图1.33所示。
图1.33 创建newtxt文件夹
Step02:弹出界面如图1.34所示。
图1.34 选择Checkout目的文件夹
Step03:默认设置即可,单击OK按钮成功Checkout,效果如图1.35所示。
图1.35 成功Checkout
导出Checkout成功,说明匿名用户拥有读的权限。
桌面newtxt文件夹中的内容为如图1.36所示。
图1.36 空的文本文件被Checkout
Step04:使用TortoiseSVN做为客户端将文件从仓库中Checkout后,可以显示出标识文件状态的图标,但需要重启或注销,重新启动计算机或注销后的效果如图1.37所示。
图1.37 出现文件状态图标
1.2.6 更新仓库失败
Step01:编辑桌面newtxt文件夹中的1.txt文件内容并保存,这时状态图标发生变化,如图1.38所示。
图1.38 显示红色叹号代表文件被更改但未提交
出现红色叹号的含义就是文件的内容被更改了,需要提交到服务端进行保存。
Step02:鼠标右键单击1.txt文件,单击如图1.39所示。
图1.39 单击SVN Commit菜单
Step03:弹出如图1.40所示界面。
图1.40 输入提交的Message消息
Step04:单击OK按钮,1.txt文件并未正确提交到仓库,如图1.41所示。
图1.41 1.txt文件并未正确提交到仓库
说明使用基于http://协议的匿名用户还是只拥有读的权限,但还是未拥有Import文件到仓库的写权限。那如何设置使用基于http://协议的匿名用户无任何权限呢?也就是读写的权限都没有!?
Step05:编辑CollabNet\Subversion Server\httpd\conf文件夹中的httpd.conf文件配置代码段如下:
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Repository"
Require Valid-user
</Location>
Step06:再次重启2个服务CollabNet Subversion Apache和CollabNet Subversion svnserve,执行ULR网址:
http://localhost:7070/svn/ghyProject1/
打开仓库时出现登陆验证,如图1.42所示。
图1.42 匿名用户需要登陆
至此匿名用户无任何的权限了,但也登陆不了,因为无任何的用户可供使用。
1.3 配置用户读写权限
在本小节中将不再使用匿名用户进行仓库的操作,因为匿名用户的读写权限都已经被锁定,也就是无任何权限,而且SVN服务器中也没有任何被注册的用户,所以就要对SVN仓库添加1个用户ghy,并对其进行授权,从而可以在基于http协议去访问仓库时使用ghy用户进行Commit操作。
1.3.1添加用户并授予读写权限
Step01:进入CMD控制台输入命令如图1.43所示。
图1.43 增加1个ghy账户并设置密码
参数-c就是创建password.ini文件,再创建1个用户时就不需要使用-c参数了,如图1.44所示。
图1.44 增加第2个用户
Step02:在c盘中的password.ini中的账户信息如图1.45所示。
图1.45 添加了2个账户
Step03:进入C:\Program Files\CollabNet\Subversion Server\httpd\conf文件夹,编辑httpd.conf代码片段如下:
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile C:\password.ini
Require Valid-user
</Location>
代码DAV svn配置Apache启动svn模块,代码SVNParentPath C:\svn_repository的作用是设置C:\svn_repository路径中的每个文件夹都是一个仓库,代码AuthType Basic作用是启用基本的账号及密码验证,代码AuthName "Subversion Repository"的作用是当一个登陆对话框弹出时,出现在登陆对话框中的提示信息。
代码AuthUserFile C:\password.ini是指定C:\password.ini为验证用户登陆的文件,代码Require Valid-user限定用户只有输入正确的用户名及密码后才能访问这个仓库。
Step04:重新启动2个服务CollabNet Subversion Apache和CollabNet Subversion svnserve,输入URL网址:
http://localhost:7070/svn/ghyProject1/
弹出登陆界面如图1.46所示。
图1.46 必须登陆才可以进入仓库
弹出登陆界面说明现在的SVN服务器的配置使匿名用户没有读的权限。
Step05:输入账户ghy及密码123并单击“确定”按钮进行登陆,成功显示仓库中的内容如图1.47所示。
图1.47 用账户ghy密码123成功登陆
Step06:这时当你对桌面中的newtxt文件夹中的1.txt文件进行Commit时弹出登陆提示如图1.48所示。
图1.48 登陆成功才可以进行Commit提交
Step07:成功登陆后成功提交如图1.49所示。
图1.49 成功登陆后成功Commit提交
1.3.2 配置匿名用户拥有读权限登陆用户读写权限
在一些开源的项目中,允许匿名用户拥有读权限,而登陆用户拥有读写权限,下面开始实现这样的功能。
Step01:创建实验用的testtest仓库,并添加名称为testtest的账号,密码为123。
Step02:更改文件C:\Program Files\CollabNet\Subversion Server\httpd\conf\httpd.conf中的配置代码如下:
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile C:\password.ini
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require Valid-user
</LimitExcept>
</Location>
Step03:重启SVN和Apache服务。
输入URL:
http://localhost:7070/svn/testtest/
后的效果如图1.50所示。
图1.50 匿名用户拥有读权限
Step04:如果向testtest仓库导入数据时则出现登陆的界面如图1.51所示。
图1.51 匿名用户不允许写
Step05:如果输入账号testtest及密码123后的效果如图1.52所示。
图1.52 登陆用户才拥有写权限
1.3.3 配置仓库由指定的用户读写
Step01:在C:\password.ini文件中添加新的用户ghy。
Step02:现在想实现仓库根文件夹C:\svn_repository中的所有仓库只允许ghy账户操作,更改配置文件C:\Program Files\CollabNet\Subversion Server\httpd\conf\httpd.conf代码如下:
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile C:\password.ini
Require user ghy
</Location>
Step03:重启SVN及Apache服务。
Step04:这时想向testtest仓库Import文件时只有ghy账号才拥有权限,Checkout也是这样。
1.3.4 使用blame菜单对改动进行追踪
菜单blame具有回溯的特性,也就是可以追踪哪行代码是由哪个程序员设计的,菜单如图1.53所示。
图1.53 对文件执行blame菜单
弹出界面如图1.54所示。
图1.54 默认配置
单击OK按钮后的效果如图1.55所示。
图1.55 每个Revision版本都能找到由哪个修改者提交的
Revision版本号是3的由newghy修改,Revision版本号是4的由ghy修改,以此类推。
1.4 配置多个仓库根目录
在安装CollabNetSubversion-server.exe服务端软件时,默认是将C:\svn_repository文件夹做为仓库的根目录,其实还可以创建多个仓库根目录,这样可以将不同的项目放入不同的仓库中进行管理。
Step01:下面就在c盘中创建C:\svn_repository2路径做为第2个仓库根目录,并在此文件夹中创建名称为bb的仓库,如图1.56所示。
图1.56 svn_repository2路径中创建bb仓库
Step02:但svn_repository2路径还需要在C:\Program Files\CollabNet\Subversion Server\httpd\conf\httpd.conf文件中进行配置,配置第2个仓库根目录的代码如下:
<Location /svn>
DAV svn
SVNParentPath C:\svn_repository
</Location>
<Location /xyz>
DAV svn
SVNParentPath C:\svn_repository2
</Location>
由于标准的HTTP协议没有版本控制的功能,那么想要让Apache与Subversion协同工作就需要使用WebDAV(Web-based Distributed Authoring and Versioning)Web分布式创作和版本控制,它是对HTTP1.1版本的扩展。
指令DAV svn的作用是在Apache服务器中启动SVN模块,而代码SVNParentPath C:\svn_repository2的作用是使用C:\svn_repository2路径做为仓库的根文件夹,代码Location /xyz的作用就是定义访问仓库URL的前缀。
Step03:上面的配置可以使用如下的URL来访问svn_repository2根文件夹中的指定bb仓库:
执行URL后的效果如图1.57所示。
图1.57 显示bb仓库中的内容