【1】创建一个版本库
为了使用SVN,除了必须安装SVN软件和客户端(可选)外,我们还必须创建一个版本库(Repository)。
在创建版本库之前我想说的是:不管如何请确保你有对版本库进行直接访问的权限。因为某些SVN操作的命令不能在客户端进行,必须在拥有版本库的机器上进行。所以我建议在本系列中把版本库安装在本地。
按照约定,我们的版本库要安装在C:\Develop\MyRepository\Workspace下。那么创建它的命令是什么呢?
Step 1: 在DOS命令行环境下转到C:\Develop\MyRepository\目录下
Step 2: 在命令下执行如下命令:C:\Develop\MyRepository\Workspace>svnadmin create .
这个命令执行后不会在控制台输出任何结果,但是你会发现现在在Workspace目录下多出了若干目录和文件,它们包括:目录conf、db、hooks、locks和若干文件。这就是它的作用了。SVN通过这个命令为我们立即创建了一个版本库,以后我们要做的所有操作,每次操作的历史记录都会存储到这里。
注意:
svnadmin 命令是SVN管理员使用命令,必须在拥有SVN软件的机器上进行。假如你是通过客户端连接的,那你将没有权限执行这个命令。其次 create 是子命令,指出本次的管理操作是一个创建动作。最后实心句点代表了当前目录。整个命令就是告诉SVN:我希望在当前目录位置创建一个版本库。你可以指定任意位置来创建一个版本库
【2】访问版本库
当版本库创建完毕后,我们想到的第一件事就是如何访问它。这里访问版本库包含三个方面的问题:
A.以什么协议访问?
B.从什么地方访问?
C.用什么命令访问?
SVN提供了几种访问方式来让我们看到它的版本库内容。这些方式包括:
A.使用传统的file协议访问方式
B.使用传统的http协议访问方式
C.使用独有的svn协议访问方式
实际上我们最常使用的是第2和第3种方式。第2种方式适用于本地访问,即不需要跨网络的方式。第3种适用的范围更广,可以配置从外网访问SVN,甚至可以使用SSL进行加密。这里因为我使用的Apache+SVN的组合,所以我的访问方式是使用http协议。我的Apache的http.conf文件配置如下:
<Location /svn>
DAV svn
SVNParentPath C:\Develop\MyRepository
AuthType Basic
AuthName "Subversion repositories"
AuthUserFile C:\Develop\CollabNet\httpd\conf\passwd
AuthzSVNAccessFile C:\Develop\CollabNet\httpd\conf\authz
Require valid-user
</Location>
这意味着只要我访问的URL路径为:http://localhost:8000/svn/Workspace,Apache会知道我实际上访问的是路径:C:\Develop\MyRepository\Workspace。并且它知道如何去哪里找用户验证文件和权限文件。
好了我们的第一个问题:使用什么方式访问?已经解决了。答案就是使用http协议。
关于第二个问题的答案已经变得很清晰了,既然http协议是基于web的协议,那么我们可以使用任何可以识别HTTP协议的工具去访问。从浏览器,甚至从DOS命令端都可以。
现在是最后一个问题了,SVN分别为服务端和客户端提供了不同的命令来访问版本库。请看下面的表格:
|
列出目录结构
|
显示项目信息
|
显示项目内容
|
显示工作拷贝信息
|
客户端:svn
|
svn list
|
svn info
|
svn cat
|
svn status
|
服务端:svnlook
|
svnlook tree
|
svnlook info
|
svnlook cat
|
|
我们可以看到对于svn和svnlook,它们都有一些相同的子命令:info,cat。那么在使用的时候有什么不同吗?下面是两个基本原则:
A.svn命令是在客户端使用的,而svnlook命令只能在拥有版本库的机器上使用(即版本库服务器)
B.svn命令的路径参数可以是本地路径形式(PATH),也可以是远程路径形式(URL);svnlook只能使用PATH形式
关于这些命令的不同用法,我会在后续的文章中一一讲解。下面我们先来关注svn list和svnlook tree命令
【3】svn list和svnlook tree命令
假设目前在我们的版本库下存在两个目录:Ericsson和Learning。那么我们现在分别使用svn list和svnlook tree命令来查看这个目录结构:
C:\>svn list http://localhost:8000/svn/Workspace
Ericsson/
Learning/
C:\>svnlook tree C:\Develop\MyRepository\Workspace
/
Learning/
Ericsson/
C:\>svnlook tree http://localhost:8000/svn/Workspace
'http://localhost:8000/svn/Workspace' is a URL when it should be a path
我们说过svnlook tree命令只能使用本地路径方式,不能使用远程路径,所以第三个命令执行时会报错。
可能你会说:我并没有发现有诸如“C:\Develop\MyRepository\Workspace\Ericsson”或者“C:\Develop\MyRepository\Workspace\Learning”之类的路径存在啊?注意这里不是以磁盘文件的路径来表示的,如果我们把C:\Develop\MyRepository\Workspace视为版本库的根目录/,其它下级子目录或文件就是相对于该根目录/的。
也许你又会说,那么我们能不能使用诸如svn list C:\Develop\MyRepository\Workspace的方式呢?试一试:
C:\>svn list C:\Develop\MyRepository\Workspace
svn: 'C:\Develop\MyRepository\Workspace' is not a working copy
很遗憾,当svn list 命令使用本地路径的时候,本地路径必须是一个Working copy下的路径,也就是说这个PATH必须是一个从版本库check out出来的项目的根路径或下级路径。因为SVN最终会把该本地路径转换成对应的版本库路径(也即是远程路径形式,所以如果本地路径不是一个Working copy那么转换工作将会失败)。
下面我们把svn list和svnlook tree命令的用法总结一下:
A.svn list PATH:列出PATH对应的版本库路径下的目录内容
B.svn list URL: 列出URL对应的路径下的目录内容
C.svnlook tree REPOS_PATH:递归地列出REPOS_PATH对应的版本库路径下的目录树内容
D.svnlook tree REPOS_PATH PATH_IN_REPOS: 递归地列出REPOS_PATH下子目录PATH_IN_REPOS路径下的目录树内容
注意使用svnlook tree命令时,有时我们不想看到整棵目录树的内容,而只想看到某个分支的内容,那么我们就可以使用svnlook tree REPOS_PATH PATH_IN_REPOS的形式。另外要注意的是没有svn list PATH SUB_PATH的形式。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-12-07 16:12
Paul Lin 阅读(684)
评论(0) 编辑 收藏 所属分类:
项目管理