作为代码库数据存放地的服务器,自然是开发管理的重点对象之一。Subversion服务器管理涉及的主要命令:
svnlook | 查看代码库的信息,其中的路径是代码库的路径。 |
svnadmin | subversion管理工具。 |
svndumpfilter | 指定dump代码库的过滤条件。如,在导出的代码库中包含哪些文件,排除哪些文件。 |
svnserve | subversion服务器程序。 |
Subversion没有提供远程的服务器控制工具,对于服务器的管理命令必须运行在与代码库相同的机器上。这样做的目的也是为了更加的安全。
主要的服务器管理活动:
1. 代码库的基本管理。
创建 | 动机 | 建立整个项目的版本控制的环境和目录结构。 |
步骤 | 1. svnadmin create 目录名。目录可以存在,也可以不存在。目录如果存在,目录必须为空目录。 2. 创建版本库的本地内容。如果是全新的项目,那么可能就只有空的目录结构。如果是进行中纳入版本控制的项目(即以前项目内容没有使用版本控制),那么需要先把整个项目复制到服务器的上。这种情况下,目录包含目录结构以及项目文件。 3. svn import 目录 代码库存放位置 -m 消息。成功后,目录中的内容进入“代码库存放位置”,目录本身就没用了。 注意:目录本身不会进入代码库,只有目录下的内容才会进入。如: project /src /lib /readme.txt 使用svn import project …后,在代码库中有readme.txt,src,lib,而没有project。为了使project进入代码库,那么在它的上一级在建一个目录,如tmp,使用这个目录作为import的目录。 |
导出 | 动机 | 备份代码库,Subversion的导出文件格式是OS无关的。 |
步骤 | svnadmin dump 版本库目录 > 文件名 |
导入 | 动机 | þ 代码库的数据迁移,如从一种OS到另一种OS。 þ 恢复损坏的代码库。 þ 将原来大的代码库拆分成多个小的代码库,如原来的代码库目录如下: projects /project1 /project2 /project3 现在想以project1、project2、project3分别作为一个代码库来进行版本控制。 þ 将小代码库合并,即上一种情况的反面。 |
步骤 | 1. 获取代码库的导出文件。注意:周期备份的重要性。当代码库损坏后,dump出来的文件也肯定是坏的。此时,就必须使用以前备份的文件。 2. svnadmin create 新代码库目录。 3. 拆分版本库。如果不需要,跳过此步。在Windows下(unix下使用cat): type 导出文件 | svndumpfilter include(exclude) path > 新导出文件 4. svnadmin load 新版本库目录 < 导出文件。如果是合并,那么需要指定父目录: svnadmin load新版本库目录 --parent-dir 父目录< 导出文件 |
清理事务 | 动机 | 清除提交死事务。通常,事务结束(成功或失败)时会被清除。但是,在有些异常情况下,会导致清除工作永远不再发生。 |
步骤 | 1. svnadmin lstxns来列出未处理的transaction。 2. 使用svnlook加上--transaction来查看事务的属性。 3. 确认无误之后,使用svnadmin rmtxns 事务名来清除事务。 也可以使用一条命令来完成,如: svnadmin rmtxns myrepos 'svnadmin lstxns myrepos ' |
修复版本库 | 动机 | 解锁代码库。如由于前次执行时,断电导致前一个用户锁住代码库。 |
步骤 | svnadmin recover 版本库目录,在执行这个命令时,确定是独占代码库,在执行完之后,重启服务器。 |
释放无用的数据库日志 | 动机 | 节约硬盘空间。(仅对代码库格式为Berkeley DB时需要)。 不用的数据库日志,是指活动数据库不用的日志。但是这些文件需要被保存,以防万一需要时恢复数据库。 |
步骤 | 1. 列出无用日志文件 svnadmin list-unused-dblogs 代码库目录 2. 归档并释放 svnadmin list-unused-dblogs 代码库目录 | xargs rm |
2. 启动服务器。Subversion支持的存取协议:
file:/// | 本地文件存取,此时代码库位于本地。如:file:///X:/path/to/repos。 |
http:// | 通过webdav连接知道Subversion代码库的Apache http server来存取代码库。对于Apache http server需要安装subversion提供的关于webdav的模块,同时还需经过相关的配置。如:http://svn.example.com/repos/calc。 |
https:// | 与http://相同,但使用ssl。 |
svn:// | subversion协议。如:svn://example.com/usr/local/repos/project |
svn+ssh:// | subversion协议,并有ssh加密。如:svn+ssh://example.com/usr/local/repos/ |
对于file:///协议,不需要启动Subversion的服务器守护进程,svnserve。svnserve的开关含义:
- -i 每个请求会产生一个svnserve进程。
- -t 一般用于RSH和SSH,对于每个经过验证验证的用户来说,就象本地用户通过File:///来存取代码库一样。这个用户需要有操作Repository的权限。
- -d 以守护进程的方式运行,所有请求都有一个svnserve进程。
当服务器运行之后,需要使用代码库的绝对路径来存取。如版本库位于/usr/local/repositories/project1,那么对于客户端对应的访问的url:
svn://host.example.com/usr/local/repositories/project1,
为了简化和安全,可以使用-r来指定root。如svnserve -d -r /usr/local/repositories。那么,客户端使用时直接使用svn:// host.example.com/就可以访问代码库的根目录。
3. 与Apche web server集成,这样用户就可以通过http://来访问代码库。主要的步骤:
a) 环境配置:最简单的做法就是先安装Apache Web Server,然后安装Subversion。这样相关的配置(包括Web Dav和权限)都会自动的完成。手动配置的做法,详见subversion的手册。
b) 代码库的配置,在httpd.conf文件中:
目的 | 配置 |
共享单个代码库 | <Location /repos> DAV svn SVNPath /absolute/path/to/repository </Location> |
共享多个代码库,如果这些代码库有共同的父目录 | <Location /svn> DAV svn # /svn/foo映射到/usr/local/svn/foo SVNParentPath /usr/local/svn </Location> |
注意,在location中指定的地址不要有重叠的。如已经存在一个documentroot是www,那么就不要指定/www/repo。否则,apache将不知如何处理请求的url。此时,启动apache(不需要启动svnserve进程),客户端就可以使用http://来访问代码库了。Trackback: http://tb.donews.net/TrackBack.aspx?PostId=594287