svn入门续-1

SubVersion高级操作

1、之前的操作中,我们都是以匿名方式对SVN进行操作,也就是不需要输入用户名和密码。对于读取操作来说,这是可以的,可是对于写入操作来说就不能随便允许匿名用户commit,否则项目会发生严重混乱。在SVN中,同样提供了验证机制,不过用户名是在文件中保存的,并不像CVS中那样需要提供操作系统的用户名,相对来说,是一个很大的进步,降低了系统发生侵害的可能。 下面我就来讲述如何设定验证机制。 转到SVN资源库的目录:E:\svn\repository,进入conf目录,打开svnserve.conf文件(具体内容见上篇文章),大家可以阅读该文件的内容,会发现实际上该文件就是一个设定SVN认证信息的重要文件,我们在之前已经对该文件进行了操作,增加了匿名用户的访问权限。现在我们来增加需要授权才能访问的信息。 首先将之前匿名可以访问的部分删除,只能通过提供用户名和密码才能访问SVN。将anon-access = read与anon-access = write之前增加一个#号,表示注释掉该部分。将password-db = passwd之前的#号删掉,这表示用户的用户名与密码信息放置在同目录下的passwd文件中,保存关闭svnserve.conf文件,我们看到与svnserve.conf文件同目录就有一个passwd文件,他就是存放用户信息的文件,用文本编辑工具打开它。

根据上面的内容,我们知道该文件存放用户的登录名和密码,其中[users]下就是该部分信息,形式为username=password,此时SVN已经给我们两个例子了,不过都被注释掉了,我们可以增加自己的登录信息。现在我们增加两个用户,usera 和userb,密码分别为usera123和userb123,保存,关闭该文件,现在我们要使用用户登录信息来操作SVN。 注意:在一次登录后,SVN会将我们的登录信息保存起来存放在硬盘上的文件中,其存放位置为:C:\Documents and Settings\[你的登录系统用户名] \Application Data\Subversion,如果想要删除该信息,只需要将该目录中的auth文件夹删除即可。

需要注意:不管哪个配置文件,每一行必须顶头开始写,即不允许行首是空格。

2、使用图形化客户端工具tortoiseSVN

TortoiseSVN实际上是对Windows操作系统的文件夹增加的一个外壳,大家用鼠标右键点击时会出现TortoiseSVN的操作快捷方式。下载安装

在E盘的根目录下新建一个目录:import,进入import目录后我们新建一个目录src和一个文本文件test.txt,并且在test.txt中输入一些文本。我们在import目录上点击鼠标右键,会出现TortoiseSVN的命令菜单,我们选择TortoiseSVNimport命令,这表示将该目录导入到服务器中,纳入到SVN的管理之下。出现如下界面

其中上面的输入框表示我们要将该目录导入的服务器地址,这里是svn://localhost/import,其中加上import的作用是将该项目与SVN管辖的其他项目分开,这样我们在checkout时就可以只checkout该项目而不必全部都检出,当然你不必一定输入import,可以输入任何名字都可以。下面的是输入一些日志信息,可以省略。然后点击ok,弹出认证窗口,需要输入用户名和密码,这里就输入我们在passwd中设置的用户usera和密码usera123,点击确定后,导入成功,如下:

接下来我们需要从服务器端将该项目checkout出来。 首先在E盘下新建一个目录hello,作为checkout项目的目录。直接在hello目录上点击右键或者进入hello目录后在空白处点击右键选择SVN Checkout

上面的输入框就表示服务器的url,这里我们填写:svn://localhost/import表示从方才import的目录中进行检出。下面的输入框表示检出到哪里,默认情况下会被自动填写当前目录,即E:\hello.点击ok,checkout操作成功,已经从服务器上将import目录下的文件和目录检出,这时我们回到hello目录看看。

大家可以看到,目录src和文件test.txt已经被检出,并且上面还有一个绿色的勾,这个绿色的勾就表示该文件或者目录是与服务器保持一致的,即内容没有发生变化,可以看到TortoiseSVN这种标识文件和目录的方式非常利于我们观察文件和目录的变化。如果我们不想让匿名用户读我们SVN服务器上的文件该怎么办呢?因为之前写操作是需要输入登录信息的,而读信息是不需要的。实际上我们可以这样来设置。 打开SVN仓库中的conf目录下的svnserve.conf文件,我们增加一行 anon-access = none  ,这表示匿名用户将没有权限读和写。实际上SVN默认将匿名用户的访问权限设为读,而将登录用户权限设为写,接下来重新启动一下SVN的服务。让改变生效。

现在在E盘再新建一个目录hello2,作为我们checkout的存放目录,在重复上述检出动作,会发现这时需要输入用户和密码了。

注意:如果有的读者这个地方TortoiseSVN并没有提示输入登录信息,而是直接将文件检出,那么说明你之前已经将登录信息保存起来了,我们到 C:\Documents and Settings\【登录操作系统用户名】\Application Data\subversion目录下将保存登录信息的auth目录删除就可以了

3、进行commit操作。首先修改text.txt文件内容并保存,再看hello目录

可以发现,test.txt文件已经发生了变化,由之前绿色的勾变成了红色的感叹号,这表明该文件已经发生了更改,变的与服务器的文件不一样了,右键点击test.txt,选择SVN commit…输入用户、密码,提交,import成功,输入用户密码时如选择Save authentication,下次就不用再次输入了,其中SVN将我们的登录信息保存在本地文件中,位置在前面已经说明了。我们再回到hello目录,刷新一下,test.txt又变成绿勾了。

4、update操作

右键点击test.txt选择SVN update…  我们看到命令成功执行了,由于该文件没有发生变化,所以更新后也没有发生变化。 下面进入src目录,新建一个文本文件:srctest.txt,并输入一些内容。右键点击srctest.txt,选择TortoiseSVNAdd…   命令成功执行后, 我们再回到src目录,刷新一下界面

12.txt的图标样式是新建的文件并且没有执行add命令,srctest.txt是执行了add命令后的样式——变成了一个蓝色加号,这表明该文件已经增加到了SVN的管理中,不过此时还没有commit,下面再对该文件进行commit操作。

现在我们在srctest.txt文件上右键选择delete,文件已经被删除了,不过要想影响到服务器,我们必须commit 在src目录中的空白处右键commit

我们已经把删除srctest.txt的信息成功的提交到了服务器端。 现在不仅在客户端,而且在服务器端都不存在langsin.txt文件了。即使你重新进行 checkout操作也还是无法得到该文件了,也就是说该文件彻底被删除了,除非你checkout时指定检出哪个最新的版本方可以得到该文件。 这是SVN优于CVS的一个地方,在CVS中即使你删除文件提交。在你重新checkout时依然可以得到该文件,也就是说你不可能彻底删除某一个文件。这在实际项目中是非常不方便的。

5、SubVersion整合Apache

下载2.0.x版本(注意,请不要下载2.2.x版本,因为我们之前下载的SVN是对应到Apache2.0版本的)httpd-2.0.64-win32-x86-openssl-0.9.8o.msi,进行安装

首先进入SubVersion的安装目录,进入bin目录,选中mod_authz_svn.so与mod_dav_svn.so两个文件,选择拷贝 进入Apache的安装目录C:\Program Files\Apache Group\Apache2,进入modules目录 将刚才选中的两个文件粘贴到这里 回到Apache安装目录的conf目录,进入,用文本编辑器打开httpd.conf文件,这个文件是Apache的配置文件,非常重要。找到第145行和146行。将前面的#号去掉,表示取消注释。这两行内容如下:
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so

转到173行,增加如下两行内容:

LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
表示将我们之前拷贝的模块导入到Apache中

转到该文件的最后,增加如下内容:

 <Location /svn>
    DAV svn
    SVNPath E:/svn/repository
</Location>

该语句块的作用是将svn的服务器目录映射到访问Apache的虚拟路径svn,就好象我们在配置 Tomcat时,增加一个Context一样。即用户访问/svn地址时,Apache会自动将该请求转到E:\svn\repository目录下。 重新启动Apache

经过测试,这种直接拷贝mod_authz_svn.so与mod_dav_svn.so两个文件到apache安装目的modules下的方式不好用,启动时提示the requested operation is failed!,将
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
修改为:

LoadModule dav_svn_module “D:\Program Files\Subversion\bin\mod_dav_svn.so "
LoadModule authz_svn_module "D:\Program Files\Subversion\bin\mod_authz_svn.so "
apache启动成功

这时我们注意到Apache下面的状态栏已经增加了SVN的信息,这就表明我们已经成功的将二者整合起来了。
在浏览器中输入如下地址:http://localhost/svn,OK,我们看到我们现在已经成功的通过浏览器访问SVN仓库中的内容了。点击各个项目的名称就可以进行查看了, 注意:在进行SVN与Apache整合时,一定要注意两者的版本匹配问题,否则将会导致失败。

6、大家这时会发现即使我们在SVN中设置好了需要登录才能读取文件,但是使用Apache方式通过浏览器依然不需要登录就可以浏览。这是由于SVN与Apache是采用不同的方式来控制访问权限的,如果你使用svn协议来访问,那么就必须输入登录信息才能访问,而如果使用http协议就不需要输入登录信息就可以访问。
实际上采用Apache方式有着比SVN更好的访问控制方式,因为Apache已经成为一个相当成熟的web 服务器。下面我们就来学习如何在Apache中设置访问权限信息。

打开Apache安装目录下的conf目录中的httpd.conf文件,转到文件的最后,在</Location>之前输入如下信息。

AuthType Basic
AuthName "Subversion Repository"
AuthUserFile E:/passwd/passwords
Require valid-user

这些信息的作用是:
1). AuthType表示验证类型,这里我们采用BASIC即基本方式,也是最常用的验证方式。
2). AuthName表示出现登录对话框时,窗口的标题名。
3). AuthUserFile表示用户登录信息的存放文件,这里我们将该文件保存为E:/passwd/passwords,目前该文件还不存在,不过不要着急,我们稍后就会创建该文件。
4). Require valid-user 表示只有认证的用户才能访问,否则匿名用户也可以访问。
OK,保存该文件,关闭它。接下来我们需要创建登录信息文件passwords. 转到Apache的安装目录,进入到bin目录中,这里存放的是Apache的所有命令文件。注意到有这样一个可执行文件htpasswd.exe文件,它就是我们创建登录信息的文件,不过该命令不能通过直接双击的方式执行,而是需要通过命令行的方式执行。 为了方便命令的使用,我们将bin目录加到系统的path环境变量中,否则每次都需要将命令行定位到该目录下才能执行该命令。在命令行输入命令:htpasswd

C:\Documents and Settings\Administrator>htpasswd
Usage:
        htpasswd [-cmdpsD] passwordfile username
        htpasswd -b[cmdpsD] passwordfile username password

        htpasswd -n[mdps] username
        htpasswd -nb[mdps] username password
 -c  Create a new file.
 -n  Don't update file; display results on stdout.
 -m  Force MD5 encryption of the password (default).
 -d  Force CRYPT encryption of the password.
 -p  Do not encrypt the password (plaintext).
 -s  Force SHA encryption of the password.
 -b  Use the password from the command line rather than prompting for it.
 -D  Delete the specified user.
On Windows, NetWare and TPF systems the '-m' flag is used by default.
On all other systems, the '-p' flag will probably not work.

我们可以参照htpasswd的命令选项来决定我们创建用户的命令。 在前面的配置中,我们知道我们将把存放用户名与密码的文件放在E:/passwd/passwords,即E盘passwd目录下的passwords文件中。那么首先我们需要在E盘根目录下创建名字叫passwd的文件夹。然后在命令行输入:htpasswd –c E:/passwd/passwords hello

C:\Documents and Settings\Administrator>htpasswd -c e:\passwd\passwords hello
Automatically using MD5 format.
New password: *****
Re-type new password: *****
Adding password for user hello

该命令已经成功执行,其中参数-c的作用就是create,即创建一个新文件,因为在这之前passwords文件还并不存在,所以我们需要首先创建它。而后面的文件路径就表示创建文件的位置以及文件名,这里叫passwords,要注意的是其父目录passwd一定要事先创建好,否则htpasswd命令会报错。最后的hello表示我们将要创建一个用户名为hello的用户。 接下来的提示要求输入hello用户的密码,其中密码默认使用MD5方式加密。OK,我们看到我们创建的第一个用户已经成功了

再创键一个用户world:  htpasswd e:\passwd\passwords world

查看生成的passwords文件内容:
hello:$apr1$No3.....$i5goIl03Yfh4bo3O0SgNQ/
world:$apr1$Ay3.....$1CjK1DxIbN7wbgzyY52Vp0

接下来,我们再创建一个用户microsoft,密码也为world。使用如下命令 htpasswd –p E:/passwd/passwords Microsoft      ,其中-p参数表示密码不使用加密方式,而是采用通常的字符文本方式,即明文。

hello:$apr1$No3.....$i5goIl03Yfh4bo3O0SgNQ/
world:$apr1$Ay3.....$1CjK1DxIbN7wbgzyY52Vp0
microsoft:world

现在关闭passwords文件,重启Apache服务器。在浏览器地址栏输入http://localhost/svn

我们看到这时出现认证窗口,只有输入有效的用户名与密码才能登录成功,并且登录窗口的标题为:Subversion Repository就是我们方才在httpd.conf文件中设定的AuthName值。输入用户、密码,,输入合法的用户信息后,用户就可以成功登录,并查看SVN仓库中的项目信息了。

7、现在让我们用http方式进行svn浏览,使用TortoiseSVN工具。 在E盘下新建一个目录http,在http里面使用TortoiseSVN进行浏览

输入用户密码

可以查看服务器端所有仓库的文件和目录。与我们之前使用svn协议时一样。我们也同样可以进行checkout

8、SubVersion整合Apache高级操作

有些时候我们在SVN服务器中有很多项目,不同的项目存放在不同的目录下,如果用SVNPath E:/svn/repository来指定的话将会非常不方便,因为这种方式只能指定一个目录,如果要包含所有项目,那就只能指定仓库的根目录了,所以就有了SVNParentPath的出现。 顾名思义,SVNParentPath指的是仓库的根目录,也就是所有项目的根路径,那么在我们这里SVNParentPath就应该是E:/svn/repository,然后我们可以将自己的项目分别建立在这里目录之下的不同子目录中,而不必都建在这个根目录之下,这对后面即将讲到的分级权限认证也有很大帮助。 打开httpd.conf文件,找到后面的Location部分。将SVNPath改为SVNParentPath,其他不变,保存,关闭。

这时我们发现我们更改后已经无法浏览仓库内容了,这是由于我们之前创建的仓库都是以repository为根路径的,所以一旦将它改成ParentPath后就无法正常访问了。实际上,在公司里,我们要import一个项目到SVN上,一般都不会import到根目录中,而是import到项目特定的目录中,这样当从SVN中检出时我们也只会检出特定的项目,而不是将SVN中所有的项目全部检出来,因为仓库中可能有很多个其他项目。 OK,现在我们就来实践一下。 在E:\svn\repository下新建一个仓库。首先建立一个目录:subsvn

然后在subsvn下新建一个仓库,方式同前,采用命令行方式,在命令行中输入如下命令:svnadmin create E:\svn\repository\subsvn

仓库创建成功。接下来我们要import项目到该子仓库中。创建一个目录try,然后在其下建立一个目录和一个文件,方式同前,并在文件中输入一些文字。将try目录import到SVN上去。

请注意,要在路径后加一个子目录subsvn,意味着import到SVN上的一个子仓库subsvn中。

我们看到import操作成功完成。采用SVNParentPath方式,当我们新建仓库时也并不需要重启Apache服务器,因为SVNParentPath指定的路径就是仓库的父目录,我们可以通过浏览器查看刚才import的项目。这里注意地址:http://localhost/svn/subsvn,如果输入http://localhost/svn,则无权限访问,因为默认情况下我们只能访问其中的子仓库。

如果想让用户可以读仓库中的文件,而不能写内容到仓库中,比如不能commit到仓库中该怎么办呢?将httpd.conf中的Require valid-user改为如下:
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>

这表示对于匿名用户可以读,但是只对认证用户开放写操作。 重启Apache. 通过浏览器访问资源库,可以访问到,并不需要我们输入认证信息。说明我们的配置是正确的。现在用TortoiseSVN将该项目检出,然后修改文件再提交,看看是否如预期。

新建一文件夹,执行Checkout操作,并没有提示要我们输入认证信息。修改当中的文本文件,然后提交,就会出现认证窗口。输入认证信息才能提交成功

9、假设SVN仓库中有很多的子仓库,每个子仓库中又有很多目录和文件,那么我需要配置以便使某些用户可以访问某些仓库,即可以读写;而另外一些用户只能读不能写,不过这两种类型的用户都需要输入认证信息方能进行操作。Apache同样为我们提供了这种需求的解决方案。

我们先来import另一个项目到SVN仓库中以便后面操作使用,为此我们在SVN仓库中再建一个子仓库。首先要开启SVN服务,建仓库过程 同前,新建仓库名为helloworld。现在我们已经有了两个子仓库:subsvn和helloworld 接下来,import一个项目到helloworld中。在import到helloworld时,增加一个虚拟目录abc

接下来打开httpd.conf文件,定位到Location部分,将其中的内容更改为如下:
<Location /svn>
DAV svn
SVNParentPath E:/svn/repository
AuthzSVNAccessFile E:/passwd/policy
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile E:/passwd/passwords
Require valid-user
</Location>

实际上这部分配置中增加了如下配置:
AuthzSVNAccessFile E:/passwd/policy 该配置表示对SVN访问策略文件。我们接下来编写该配置文件。 在E盘下的passwd目录中建立一个文件:policy

打开该文件,增加如下内容
[helloworld:/]
hello=rw
world=r
Microsoft=

保存,关闭。 增加的配置表示:对于helloworld路径,hello用户可读可写,而google用户只读,另外的用户microsoft不能读也不能写。这就定义了SVN仓库的访问策略。 重启Apache。先删除保存在本地的用户认证信息,在浏览器中访问http://localhost/svn/helloworld 输入microsoft/world,显示:

Forbidden

You don't have permission to access /svn/helloworld/ on this server.

可以看到,microsoft已经被我们配置成不能读取也不能写入,所以服务器给我们了Forbidden的信息,关闭浏览器,重新打开,输入同样的网址,这次认证信息输入world/world,可以看到,google可以读取SVN仓库中helloworld子仓库的内容,符合我们的定义,对于hello用户,也是可以访问的,因为他有读写的权限。
当我们访问:http://localhost/svn/subsvn时出现上述的Forbidden错误页面,因为我们在访问策略文件中只配置了对于helloworld仓库的访问,没有配置对subsvn仓库的访问,所以默认情况下,对于他的访问是拒绝的,这也就要求我们对每个仓库都要进行相应的配置方可进行访问。

在公司里都有不同的项目组,每个组对应自己的仓库,一个组有很多组员,如果对于每个组员都去指定他的访问权限显得十分繁琐,我们可以利用SVN中组的概念来对用户进行分类,这样大大方便了我们的操作。 将policy文件修改为如下:
[groups]
developers=hello,world
testers=microsoft
[helloworld:/]
@developers=rw
@testers=
[subsvn:/]
@developers=rw
@testers=rw

这里面我们先定义了两个组:developers和testers,后面表示这个组的用户。 接下来我们可以用@developers来引用之前定义好的组。保存,重启Apache
在浏览器中输入http://localhost/svn/helloworld,输入microsoft/world,因为microsoft属于testers组,而该组对于helloworld仓库没有访问权限,所以显示为禁止页面。如果换成developers组的用户就可以进行访问了。

9、SVN仓库的备份

对于备份,有两种方式:一是直接拷贝仓库到其他地方,优点是简单,缺点是当拷贝过程中有用户对SVN进行操作则会出现不一致问题,所以这种方式不提倡使用;二是采用SVN提供的命令,这也是我们要讲述的主要方式。 在命令行输入svnadmin hotcopy E:\svn\repository E:\backup  ,回到E盘的根目录,我们看到,备份是多么容易,当然我们也可以指定备份的目的地是网络上的其他计算机。

10、SubVersion整合Eclipse

 由于Eclipse本身并没有内置对SubVersion的支持,所以我们需要使用Eclipse的SVN插件,该插件的名字为Subclipse。根据自己的Eclipse版本选择合适的文件,我使用myeclipse8.5,eclipse3.5,下载site-1.8.18.zip

下载完毕,采用link方式进行安装,然后启动Eclipse

具体集成过程:

1)将site-1.8.18.zip解压缩到d:\myplugin目录
2)找到Myeclipse.exe所在目录,在此目录下,有一个dropins子目录,在这个子目录下建立一个svn.link的文件,文件内容为:
path = d:\\myplugin       

也就是subclipse解压所在目录,保存关闭
3)重新启动myeclipse,安装成功后->Window->Open perspective->Other,这时就可以看到选项中增加了SVN资源库研究(SVN Repository Exploring)
11、myeclipse中svn的使用

12、高效的分支(branching)与标签(tagging)功能

先说标签功能,通俗的讲,标签就是某个时间点的快照(snapshot),我们可以在项目进行到一些重要的里程碑之时为之建立标签,这样可以方便以后随时取出这些历史版本。我想你会有一个疑问:SVN不是本身就有随意取出任何一个历史版本的功能吗?是的,标签的作用主要是为了给这些特定的历史版本取一个友好的名字,以方便使用和维护。 分支则是用于创建多个并行的工作线,比如,当我们的一个项目需要为某个用户提供一些特殊的功能时,那么就可以为之创建一个分支,这样能够保证大部分代码的共用,也使得整个项目变得容易维护和管理。
SVN对于分支和标签的实现都是一样的,并且采用了与Unix/Linux硬链接(Hard-Link)类似的机制,即是说,当我们创建分支或标签时,SVN并不会立即为之创建一份拷贝,而是创建一个链接,只有当这些文件以后被修改时才会真正产生一份副本。这种“缓式拷贝”方法是一种常见的优化方法,能够有效的节约空间。 那分支和标签又有什么不同呢?不同之处仅仅在于其“约定成俗”的含义,标签意味着你不会再对其进行修改,而分支意味着你会对它进行开发。二者在实现上却是一样的,都是通过Branch/tag命令执行。

现在我们为项目创建一个标签。 右键项目,选择TeamBranch/tag…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值