分类: LINUX
2010-06-15 19:14:38
本文将介绍如何在Linux环境下(以Redhat9为例) 通过Subversion 来构建小组开发过程中最为重要的版本控制环境,包括Subversion 环境的安装配置,以及客户端的配置和使用。(某些操作,如make install需要root权限,简便起见,在没有特殊说明的情况下,下面的工作均使用root账户完成。)
1. 安装Apache HTTP Server
httpd是web服务器,httpd和subversion 配合,可用来通过web访问subversion,得到httpd-2.2.4.tar.bz2文件后,通过以下命令解压:
tar -jxvf httpd-2.2.4.tar.bz2
进入解压后的目录后,执行
./configure --enable-dav --enable-so --enable-nonportable-atomics
其中,--enable-dav允许Apache提供DAV协议支持;--enable-so允许运行时加载DSO模块 ;--enable-nonportable-atomics可以在486以上的CPU上启用更加高效的基于互斥执行的原子操作。前两个参数是必须要加的,你还可以根据您的需要添加其他的参数。httpd默认安装目录为/usr/local/apache2,可通过--prefix参数指定。
另外,网络上有些howto上有在此时使用--enable-maintainer-mode参数,建议在正式的使用环境中不要使用,该参数使用所有警告和调试符号编译源代码,会影响性能。
完成后使用make命令编译httpd,执行make install则完成对httpd的安装,默认路径为/usr/local/apache2。
安装完成后,进入 /usr/local/apache2/bin目录,使用
./apachectl start启动httpd
在浏览器中打开,如果能正常显示“It Works!”,则证明已经安装成功。
2.安装Subversion
subversion的安装稍有技巧,需要下载subversion-1.4.3.tar.bz2 和subversion-deps-1.4.3.tar.bz2两个压缩包,并且解压至同一目录下,这样subversion会自动地编译、安装依赖库;若习惯性的先安装依赖库,后安装subversion,则依赖库的编译需要手动进行。
进入解压后的目录,执行
./configure --with-apxs=/usr/local/apache2/bin/apxs --with-apr=/usr/local/apache2 --with-apr-util=/usr/local/apache2
其中,--with-apxs 用于生成apache httpd的mod_dav_svn和mod_authz_svn模块;--with-apr 和 --with-apr-util=参数指向 Apache 的安装根目录,而不是使用缺省的 SVN 安装包中自带的 apr ,否则如果你安装的 Apache 版本不同有可能导致 APR 库不匹配,出现类似:
Can't set position pointer in file '/svn/test/db/revs/1': Invalid argument 的错误。(同样可以通过 --prefix参数指定安装目录)
Configure完成后,执行make和make install命令完成安装。
Subversion编译完成后会自动在 /usr/local/apache2/conf/httpd.conf 添加
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
这两行,并且将生成的mod安装到apache2的modules目录。
3.创建repository
假设我们把版本库建立在/home目录下,那么执行mkdir repository新建版本库文件夹,
通过svnadmin create repository/test命令可创建名为test的版本库。
若创建成功,则subversion的安装便已成功完成。
这里,我使用了fsfs数据库格式,这是subversion目前的默认数据存储形式,如果想要使用Berkeley DB作为数据库格式,则需要在安装subversion之前安装Berkeley DB,并在编译subversion时使用—with-berkeley-db参数,然后可以使用
svnadmin create --fs-type bdb repository/test 命令来创建版本库。(关于两者的对比可参考Version Control with Subversion(中文书名为《使用subversion进行版本控制》)第5章)。
4.导入源代码
现在,我们已经有了一个可用的版本库了,接下来我们使用
mkdir –p import/{trunk,branches,tags} 命令在/home/svnroot目录下建立一个名为import的新文件夹,包含trunk、branches、tags 三个子目录,目录结构如下图所示。
至于为什么这么做,大家可以参考Version Control with Subversion第4章。
Some dir
|---import
|---trunk
|---branches
|---tags
下面这条语句将把路径/home/svnroot/import下的目录和文件导入到你创建的Subversion 仓库中去,
提交后的修订版为1。
svn import /home/svnroot/import file:///home/svnroot/repository/test –m "Init repository"
这里/home/svnroot/import可以使用相对路径,但file:///home/svnroot/repository/test必须以绝对路径表示。
5.版本库所有者和权限修改
目前,repository目录依然为root用户所有,默认权限为755,为了让用户能够通过apache正常读写该目录,我们需要先将该目录以及该目录的上层目录svnroot的所有权交给apache httpd(安装apache httpd的时候,会自动增加apache用户组和apache用户),然后为了安全起见,将repository和svnroot目录的权限都改为700,apache外其他用户就没有了该目录的任何权限了。
首先,打开apache配置文件/usr/local/apache2/conf/httpd.conf,确保将User和Group 设置为
User apache
Group apache
然后,进入/home目录,修改svn仓库的所有者
chown -R apache:apache svnroot
最后,修改该目录权限(不要在这里使用-R参数,apache用户需要对test下的文件有读写权限)
chmod 700 svnroot
chmod 700 svnroot/repository
至此,我们已经为subversion的使用做好了准备工作,有了一个可由apache进行读写的版本库,只要对apache稍加设置,我们便可以通过web来访问版本库了。结合httpd使用subversion时的身份认证和授权设置问题是需要特别注意的,我将在第二篇中详细说明。
Reference
1. Version Control with Subversion 1.4(r2730) Ben Collins-Sussman, Brian W. Fitzpatrick, and C. Michael Pilato
2. Apache HTTP Server Version 2.2文档中文版 Apache Software Foundation 金步国译
3. 在Redhat9 Linux下安装,配置Subversion 1.3.1 Wooin http://blog.csdn.net/wooin/archive/2006/07/11/903974.aspx
6.生成身份认证文件
身份认证文件保存用户的用户名和密码,用于确定用户身份。
执行以下命令来生成身份认证文件,位于/home/svnroot/repository,文件名为pwdfile
htpasswd -m /home/svnroot/repository/pwdfile michael
Re-type new password: *******
htpasswd -cm /home/svnroot/repository/pwdfile harry
New password: *****
htpasswd -m /home/svnroot/repository/pwdfile sally
Re-type new password: *******
这样michael, harry和sally这三个用户便被创建,其中-c表示创建身份认证文件,-m则表示密码使用md5加密。
最后,不要忘记将pwdfile文件的所有者改为apache,并且将其权限设为700。
7.创建授权文件
授权文件用于确定每个用户对特定目录的操作权限,格式可参考版本库下的conf/authz(conf目录下的authz文件用于svnserve的授权,与我们所使用的mod_authz_svn的授权文件具有相同的格式)。因而我们可以直接把conf下的authz复制到我们想要的/home/svnroot/repository目录下,然后加以修改。
这里我么以给test项目分配权限说明subversion的授权机制,项目的目录结构如下图所示:
Repository
|---test
| |---trunk
| |---branches
| |---tags
|
|---other projects…
其中,trunk表示主干,branches则为项目的分支,tags存放某个版本的快照。习惯上来说,大多数开发人的本地拷贝都来自truck目录,所以每个开发人员都应有trunk目录的读写权限,这样他们才能正常的进行日常的开发;而分支目录一般在,如某些开发人员需要大幅修改代码以增加新功能,或者代码进入较为稳定的阶段,开始bug去处工作等情况下使用,尽管这意味着这些代码总是有固定的一个或几个开发人员维护,但是基于“源代码共同拥有”的原则,我们还是可以将其设置为所有用户具有读写权限;tags目录则一般用于某个版本的发布,比如当项目到达版本1834时,release1已经完成,那么就可以将它复制到tags目录,作为一个快照存放,取一个好记得多的名字,比如release1(似乎应该只让某些人有写入权限,这样可以防止快照被破坏,可是即使被破坏了又怎么样呢,不要忘了我们在使用一个版本管理软件J)。
好吧,回过头来看看我们已经在身份验证文件中添加的用户,现在我们有michael, harry和sally三个用户,其中michael是项目的pm,harry和sally则是开发人员,那么很明显了,我们需要建立两个用户组g_pm和g_dev,michael属于g_pm组,harry和sally则属于g_dev组,分别授权。基于我们刚才的分析,g_pm组和g_dev组的用户都应该拥有对整个项目的读写权限,这也许太过简单了,不过正是我们目前的项目所需要的,什么时候需要一个复杂的授权方案,再修改authz文件也不迟。
根据authz文件的语法,我么可以把上述的设置表达成这样:(注意每个有效配置行的前面都不能有空格)
[groups] //群组设置
g_pm = micheal //某群组里的成员
g_dev = harry,sally
[test:/] //仓库test的根目录的访问权限
@g_pm = r //g_pm组用户具有读和写权限,’@’开头的表示群组设置
@g_dev = r //g_dev用户具有读写权限
[test:/trunk] //仓库test的trunk目录的访问权限
@g_pm = rw //g_pm组用户具有读和写权限,’@’开头的表示群组设置
@g_dev = rw //g_dev用户具有读写权限
[test:/branches] //仓库test的branches目录下的访问权限
@g_pm = rw //g_pm组用户具有读和写权限,’@’开头的表示群组设置
@g_dev = rw //g_dev用户具有读写权限
[test:/tags] //仓库test的tags目录下的访问权限
@g_pm = rw //g_pm组用户具有读和写权限,’@’开头的表示群组设置
@g_dev = rw //g_dev用户具有读写权限
如果需要对某个用户授权,可以这么写:
[test:/branches] //仓库test的branches目录下的访问权限
sally = r //sally用户具有读权限
当然,这样的authz文件显得很繁琐,而且没有必要,但是这样的配置在需求出现变化的时候将会很容易修改。
不要忘记将authz文件的所有者改为apache,并且将其权限设为700。
8.修改Apache配置文件
执行vi /usr/local/apache2/conf/httpd.conf
确保以下两行已被subversion正确添加,这样apache才能正确加载module。
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
Version Control with Subversion 1.4以及很多howto上提到的
LoadModule dav_module modules/mod_dav.so
我们已经在编译httpd时链接进了核心中,不需要作为共享对象加载。
接着,在httpd.conf的最后添加以下内容(不包括后面的注释)
DAV svn
SVNParentPath /home/svnroot/repository/ //svn父目录
AuthType Basic //客户端认证机制
AuthName "Subversion Repository" //认证域名称
AuthUserFile /home/svnroot/repository/pwdfile //身份认证文件
AuthzSVNAccessFile /home/svnroot/repository/authz //权限配置文件
Satisfy Any //先尝试匿名访问
Require valid-user //仅通过验证的用户可访问版本库
其中/svn表示一个url的模式,匹配形如的url;SVNParentPath 指定的目录下的所有项目都被subversion 认为是合法的版本库;AuthzSVNAccessFile为授权文件 ;AuthType 则制定了客户端身份认证机制,Basic表示http基本认证机制;AuthUserFile就是先前创建的密码文件;Satisfy Any 和Require valid-user告诉apache所有用户先使用匿名方式访问版本库,只有当访问控制策略要求一个真实的用户名时,apache才会对客户端进行身份验证,这是使用得最多的一种授权方式。
最后,使用如下命令重启apache httpd,打开浏览器访问svn/test/这个URL便可访问版本库了,当然,受权限的限制,必须是合法用户才能访问且具有相应的权限的目录。
/usr/local/apache2/bin/apachectl restart
至此,我们的版本 库已经进行了正确的身份认证和授权配置,并且用户可以通过浏览器来查看当前的版本库的情况,subversion已经处于可用的状态。接下来的一篇中,我 们将讨论使用subversion客户端相关的问题以及如何将subversion和apache httpd配置为系统服务。
1. Subversion之路--实现精细的目录访问权限控制 郑新星
2. Version Control with Subversion 1.4(r2730) Ben Collins-Sussman, Brian W. Fitzpatrick, and C. Michael Pilato
3. Apache HTTP Server Version 2.2文档中文版 Apache Software Foundation 金步国译
4. 在Redhat9 Linux下安装,配置Subversion 1.3.1 Wooin http://blog.csdn.net/wooin/archive/2006/07/11/903974.aspx
chinaunix网友2010-06-20 10:41:46
你好!博客狠棒If you are looking for nike air max 2010 and kobe shoes. I will tell you that MBT Shoes is well-known for its positive effect to human body. MBT is one technology originally, MBT Shoes clearance sale, it began in Masai which is a tribe of Eastern Africa. 回复 | 举报