使用Subversion构建版本控制环境(Windows)
摘要:
在软件开发中,CVS在很长的一段时间内一直都是版本控制的首选。但是现在用户有了另一个或许是更好的选择SVN(subversion)。SVN是下一代版本控制系统,完全可以替代CVS,CVS下的项目,也可以非常容易的转到SVN的控制之下(SVN项目主页是http://subversion.tigris.org,Tigris本身就是一些在SVN控制下的开源项目,可以说是sourceforge的SVN版本)。
SVN是一个自由、开放源码、跨平台的版本控制系统。它是一个通用系统,可用来管理任何类型的文件, 其中包括程序源码。
SVN的设计目标很明确,实现绝大部分CVS的已有功能,充分考虑现有的CVS用户,在使用方式上模仿CVS,同时开发了一系列工具,使得基于CVS的项目能够顺利迁移到SVN上。作为新一代的版本控制系统,和CVS相比,它有很多优点,例如目录版本控制、不可分割的提交、一致的数据处理方式和更有效率的分支与标记等。
现在,好多开源项目已经开始转移到了SVN控制之下。作为软件开发者,使用Subversion控制所开发的项目是必然趋势,本文即以Apache+SVN为例,介绍了SVN环境的答建以及简单使用方法。
一、 准备相关软件
a) 、Subversion服务器svn-win32-1.3.2.zip
建议直接到http://subversion.tigris.org/下载最新版本
b) 、Subversion客户端TortoiseSVN-1.3.5.6804-svn-1.3.2.msi
TortoiseSVN是一个非常不错的SVN客户端,可以实现跟资源管理器的紧密结合。建议到http://tortoisesvn.tigris.org/下载最新版(相信很多使用过CVS的朋友应该用过TortoiseCVS吧)。
c) 、VS.NET使用SVN的插件AnkhSetup-0.5.3.1636.msi
AnkhSVN是一个相当不错的VS.NET的SVN插件,可以到AnkhSVN的官方网站下载最新版本http://ankhsvn.tigris.org/。有关AnkhSVN的更详细的信息,请访问http://ankhsvn.tigris.org/screenshots.html。
d) 、Apache Web服务器(svn-1.3.2建议使用apache-2.0.54)。
可以到http://www.apache.org/dist/下载合适的版本,最好跟subversion软件中使用的版本一致,若要求的apache版本比较旧,可以到apache历史版本页面下载http://archive.apache.org/dist/。
e) 、TortoiseSVN简体中文语言包(LanguagePack-1.3.5.6804-win32-zh_CN.exe) ,请到http://tortoisesvn.tigris.org/download.html选择下载相应的版本。
小技巧:
以上软件下载完了后,不妨放到同一文件夹下,并附加一包含软件简单说明的readme.txt文件,以备日后使用。
二、 软件安装
a) 、安装apache
Apache的安装相当简单、值得注意的一点是,若已经安装了IIS,请先停止,可以使用以下命令:
Net stop w3svc
b) 、安装TortoiseSVN &TortoiseSVN简体中文语言包
安装没什么特别之处,只要先安装TortoiseSVN在安装语言包即可。
c) 、安装Subversion.
i. 解压下载得到的svn-win32-1.3.2.zip到c:/usr/local/目录。并重命名为svn,即可/usr/local/svn/;
ii. 拷贝libeay32.dll、ssleay32.dll两个DLL件到c:/winnt/system32目录;
iii. 拷贝libapriconv.dll、libdb43.dll、intl3_svn.dll到apache/bin目录;
iv. 拷贝mod_dav_svn.so、mod_authz_svn.so两个文件到apache的Modules/目录;
v. 在apache的conf/目录下建立一个文本文件mod_svn.conf输入以下内容
#加载相应模块
LoadModule dav_svn_module /usr/local/svn/bin/mod_dav_svn.so
LoadModule authz_svn_module /usr/local/svn/bin/mod_authz_svn.so
#LoadModule dav_svn_module modules/mod_dav_svn.so
#LoadModule authz_svn_module modules/mod_authz_svn.so
#配置仓库
<Location /svn>
DAV svn
SVNParentPath /usr/local/repository#仓库父目录位于c:/usr/local/repository
# SVNPath /usr/local/respository/svn1 #仓库目录
</Location>
vi. 若需要使用Apache验证则还需要做以下调整:
进入apache/bin目录,执行以下命令产生密码验证文件
htpasswd -cm /usr/local/svn/svn-auth-file user1
提示输入密码时输入该用户的密码
若还需要增加用户user2,则执行以下命令
htpasswd -m /usr/local/svn/svn-auth-file user2
删除某个用户(user2),可以使用下列指令:
htpasswd -D /usr/local/svn/svn-auth-file user2
使用htpasswd产生密码文件
vii. 启用验证后,SVN相关配置如下
<Location /svn>
DAV svn
SVNParentPath /usr/local/repository#仓库父目录位于c:/usr/local/repository
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /usr/local/svn/svn-auth-file
Require valid-user
AuthzSVNAccessFile /usr/local/svn/svn-access-file
</Location>
viii. 配置文件中使用到了svn-access-file,这个文件是用来控制用户访问SVN仓库权限的,下面就讲述以下access文件的配置。
[svn1:/] //这表示,仓库svn1的根目录下的访问权限
user1 = rw // svn1仓库user1用户具有读和写权限
user2 = r // svn1仓库user2用户具有读权限
[svn2:/] //svn2仓库根目录下的访问权限
user1 = r // user1用户在svn2仓库根目录下只有读权限
user2 = // user2用户在 svn2仓库根目录下无任何权限
#[/] // 这个表示在所有仓库的根目录下
#* = r // 这个表示对所有的用户都具有读权限
#[groups] // 这个表示群组设置
#svn1-developers = user1,user2 // 这个表示某群组里的成员
#svn2-developers = user1
#[svn1:/]
#@svn1-developers = rw// 如果在前面加上@符号,则表示这是个组权限设置
ix. 重启APACHE
注意:DocumentRoot目录与svn的SVNParentPath值不可设置为一样,否则可能会出现301 Moved Permanently…错误
三、 软件使用
a) 、使用命令行(CMD窗口模式)
创建新的版本库
svnadmin create /path/to/repository
svnadmin是有用的subversion系统管理命令,使用svnadmin help查看在线帮助
信息。
添加新的项目(import new project)
svn import project file:///repository_name/project -m "Comment"
svn import project http://yourhost/svn_dir/repository_name/project -m "Comment"
检出(checkout)项目
svn checkout file:///repository_name/project/trunk project
svn checkout http://yourhost/svn_dir/repository_name/project/trunk project
列出仓库中的项目(list)
svn list --verbose file:///repository_name/project
svn list --verbose http://host/svn_dir/repository_name/project
状态查询(status)
svn status
给出新文件,已经改变的文件和被删除的文件列表;
添加文件或目录(add)
svn add
删除文件或目录(delete)
svn delete
svn delete http://yourhost/svn_dir/repository/project_dir
提交(commit)
svn commit http://yourhost/svn_dir/repository/project_dir
更新(update)
svn update
更新仓库中的文件到本地。
标签和特殊版本项目
使用copy命令
svn copy http://yourhost/repos/project/trunk http://yourhost/repos/project/tags/1.0.0
用于创建某个特定版本的快照(snapshot);
svn list http://yourhost/repos/project/tags/1.0.0
b) 、下面我们就用以上介绍的命令创建一个测试仓库
i. 打开命令提示符,进入E:/repository目录,执行以下命令
ii. 重启apache,浏览http://localhost/repos/qjoa,若看到以下画面,则表示SVN已经正常工作
iii. 刚才建立的仓库只是一个空的仓库,里面没有任何的项目/文件,下面,我将演示一下怎么向该仓库添加项目,使用以下命令
svn import D:/WorkSpace/OTH_007_QJTech-OA http://localhost/repos/qjoa -m "SVN init project"
注意:以上命令必须单行输入,import项目时,最好先去掉apache验证,否则将导致import项目失败!
iv. OK,重新浏览http://localhost/repos/qjoa试试,若出现跟下图类似的画面,则表示项目导入成功;
c) 、TortoiseSVN操作简介
i. 选择语言
TortoiseSVN安装后,默认使用的是英文,为了使用中文需要执行以下操作,在windows资源管理器中右击TortoiseSVN->Settings.
弹出以下对话框,选择“中文(简体)”后点击应用,即更改默认显示为中文如下图所示:
ii. 添加项目(import)
进入需要导入的文件夹,右击 “TortoiseSVN”->“导入”,则可出现如下图所示对话框,在文件库路径中填写刚新建的仓库http://www.ilinux.com.cn/repos/qjoa,点击确定,即可完成项目的导入
iii. 检出项目(checkout)
在工作目录新建一文件夹QJOA(我使用的是D:/workspace/qjoa),在有多个项目时,使用工作目录绝对是一个不错的习惯^_^,进入qjoa目录,右击,即出现如下图所示菜单
单击“SVN取出”,则出现如下图所示的画面,
填写适当的信息,单击确定,则TortoiseSVN将开始检出项目,如下图所示
iv. 列出项目
资源管理器中右击TortoiseSVN->文件库浏览器;
在URL栏中填入仓库路径,就可以浏览仓库内容,如下图所示
v. 状态查询
vi. 添加文件或目录
选中要添加的文件夹或文件右击 “TortoiseSVN”->“添加”
vii. 删除文件或目录
选中要添加的文件夹或文件右击 “TortoiseSVN”->“删除”
viii. 提交修改
在工作目录,右击 —>“SVN提交”
ix. 更新
在工作目录,右击 —>“SVN更新”
注意:添加或删除后需要进行提交操作。更多的有关Subversion的详细用法,请查阅Subversion官方文档中文版本。
四、 相关资源
a) 、Subversion中文站(http://www.subversion.org.cn/);
b) 、Subversion官方站(http://subversion.tigris.org/);
c) 、Subversion官方文档中文版本(http://www.easyea.com/doc/CH/svnbook/);
五、 参考
a) 、Installing Subversion(http://svn.collab.net/repos/svn/trunk/INSTALL);
b) 、CVS to SVN Crossover Guide(http://svn.collab.net/repos/svn/trunk/doc/user/cvs-crossover-guide.html);
c) 、apache文档2.0(http://httpd.apache.org/docs/2.0/);