以下我所用到的软件(版本需要注意一下,因为版本差异配置什么也有可能会有差异):

 gcc 4.1.2      apache 2.2.16    sqlite 3.6.13     zlib 1.2.5    expat 2.0.1    subversion 1.6.12

 

1.安装gcc编译工具:

a) yum安装:yum install gcc    安装编译工具(为了省时间,直接用yum了)

2.安装apache:

a) 下载httpd-2.2.16.tar.bz2,

b) #tar -jxvf httpd-2.2.16.tar.bz2      解压到当前目录

c) ./configure /prefix=/user/local/server/apache2/ --enable-dav --enable-so

d) Make

但是这里出现问题:

checking for bcopy... yes

configure: creating ./config.status

CONFIG_FILES=Makefile CONFIG_HEADERS= /bin/sh config.status

config.status: line 1: _ACAWK: command not found

config.status: line 34: syntax error near unexpected token `fi'

config.status: line 34: `fi # test -n "$CONFIG_FILES"'

make[3]: *** [Makefile] 错误 2

make[3]: Leaving directory `/usr/local/server/httpd-2.2.16/srclib/apr-util/xml/expat'

make[2]: *** [all-recursive] 错误 1

make[2]: Leaving directory `/usr/local/server/httpd-2.2.16/srclib/apr-util'

make[1]: *** [all-recursive] 错误 1

make[1]: Leaving directory `/usr/local/server/httpd-2.2.16/srclib'

Make失败

安装aprapr-utril :yum install ***

仍然失败,好一阵google...发现我的时间不对.......

#net time set -S *.*.*.*   (与真机同步时间)

#make

#make install

安装完成,

#cd /usr/local/server/apache2/bin

#./apachectl restart

httpd not running, trying to start

[root@localhost apache2]# ./apachectl restart

[root@localhost apache2]# 

验证一下,用浏览器访问一下apacheIP,出现It works!说明apache已经正常工作

 

3.安装subversion:

a) ./configure --prefix=/usr/local/server/subversion --with-apxs=/usr/local/server/apache2/bin/apaxs --with-apr=/usr/local/server/apache2/ --with-apr-util=/usr/local/server/apache2/

安装之前安装sqlite 3.6.13

configure: error: subversion requires zlib

安装zlib

cd subversion/svn && /bin/sh /usr/local/server/subversion-1.6.12/libtool --tag=CC --silent --mode=link gcc  -g -O2  -g -O2 -pthread   -rpath /usr/local/server/subversion/lib -o svn  add-cmd.o blame-cmd.o cat-cmd.o changelist-cmd.o checkout-cmd.o cleanup-cmd.o commit-cmd.o conflict-callbacks.o copy-cmd.o delete-cmd.o diff-cmd.o export-cmd.o help-cmd.o import-cmd.o info-cmd.o list-cmd.o lock-cmd.o log-cmd.o main.o merge-cmd.o mergeinfo-cmd.o mkdir-cmd.o move-cmd.o notify.o propdel-cmd.o propedit-cmd.o propget-cmd.o proplist-cmd.o props.o propset-cmd.o resolve-cmd.o resolved-cmd.o revert-cmd.o status-cmd.o status.o switch-cmd.o tree-conflicts.o unlock-cmd.o update-cmd.o util.o ../../subversion/libsvn_client/libsvn_client-1.la ../../subversion/libsvn_wc/libsvn_wc-1.la ../../subversion/libsvn_ra/libsvn_ra-1.la ../../subversion/libsvn_delta/libsvn_delta-1.la ../../subversion/libsvn_diff/libsvn_diff-1.la ../../subversion/libsvn_subr/libsvn_subr-1.la /usr/local/server/apache2//lib/libaprutil-1.la     -lexpat /usr/local/server/apache2//lib/libapr-1.la -lrt -lcrypt  -lpthread -ldl  

/usr/bin/ld: cannot find -lexpat

collect2: ld returned 1 exit status

make: *** [subversion/svn/svn] 错误 1

安装epart.

subversion/svnversion/svnversion . /repos/svn/trunk > /usr/local/server/subversion/include/subversion-1/svn-revision.txt

/usr/local/server/subversion-1.6.12/subversion/svnversion/.libs/lt-svnversion: error while loading shared libraries: libexpat.so.1: cannot open shared object file: No such file or directory

make: *** [revision-install] 错误 127

# whereis libexpat.so.1

libexpat.so: /lib/libexpat.so.0 /usr/local/lib/libexpat.so.1 /usr/local/lib/libexpat.so

#vi /etc/ld.so.conf

include ld.so.conf.d/*.conf

/usr/local/lib/

#ldconfig

#make install

成功

 

在httpd.conf中应该会有

LoadModule dav_svn_module         modules/mod_dav_svn.so

LoadModule authz_svn_module       modules/mod_authz_svn.so

配置:

#vi /usr/local/server/apache2/conf/httpd.conf

添加一段Location

<Location /svn/project01>
    DAV svn
    SVNPath /home/svn/project01               项目路径 (在网上有用SVNParentPath的,可能是版本不同的原因一直没成功,换成SVNPath就OK了)
    AuthzSVNAccessFile /home/svn/project01/conf/authz        权限控制文件
    AuthType Basic
    AuthName "project01"
    AuthUserFile /home/svn/project01/pass01      验证文件(用户、密码文件)然后会说明怎样建
    Require valid-user
</Location>

#svnadmin create /home/svn/project01          创建项目

这里,我使用了fsfs数据库格式,这是subversion目前的默认数据存储形式,如果想要使用Berkeley DB作为数据库格式,则需要在安装subversion之前安装Berkeley DB,并在编译subversion时使用with-berkeley-db参数,然后可以使用

svnadmin create --fs-typebdbrepository/test 命令来创建版本库。

 

现在,我们已经有了一个可用的版本库了,接下来我们使用

#cd /home/svn/project01

#mkdir p import/{trunk,branches,tags}      /home/svn/project01目录下建立一个名为import的新文件夹,包含trunkbranchestags三个子目录,目录结构如下图所示。

至于为什么这么做,大家可以参考Version Control with Subversion4章。

 

project01

       |---import

              |---trunk

              |---branches

              |---tags

 

下面这条语句将把路径/home/svn/project01/import下的目录和文件导入到你创建的Subversion仓库中去,

提交后的修订版为1

 

 

#svn import -m "initial import" /home/svn/project01/import file:///home/svn/project01        导入source ,也是导入第一个版本,也是将/home/svn/project/import 作为svn访问的根目录。 

 这里有人可能会出现以下报错:

svn:error while loading shared libraries:/usr/local/lib/libsvn_ra_dav-1.so.0:can not restore segment prot after reloc: Permission denied

这是因为selinux导致的,关掉selinux就可以了,或者用以下方法(运行以下命令便可以):

#chcon -t texrel_shlib_t /usr/local/lib/libsvn_ra_dav-1.so

#htpasswd -cm /home/svn/project01/pass01 a          新建用户a 并设置密码,-c是创建密码文件 m是指md5加密,如果添加用户的话就不能再加-c了,这样会把原来的密码文件 pass01给覆盖掉。

#vi /home/svn/project01/conf/authz

添加:

[/]

*=r

让所有人都有权限读/   即:http://serverIP/svn/project01

最近将整个svn的目录的属主和属组都给运行apache的那个用户,默认是daemon,有的是apache

可通过ps -aux |grep apache 查看是哪个用户运行的apache ,如果要修改的话,打开apache配置文件/usr/local/server/apache2/conf/httpd.conf,确保将UserGroup设置为

User apache

Group apache

#chown -R apache.apache /home/svn

为了更安全一些

 

最后,修改该目录权限(不要在这里使用-R参数,apache用户需要对test下的文件有读写权限)

 

chmod 700 /home/svn

chmod 700 /home/svn/project01

 

下面是我摘抄下来的权限控制文件project01/conf/authz的说明:

创建授权文件

 

授权文件用于确定每个用户对特定目录的操作权限,格式可参考版本库下的conf/authzconf目录下的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, harrysally三个用户,其中michael是项目的pmharrysally则是开发人员,那么很明显了,我们需要建立两个用户组g_pmg_devmichael属于g_pm组,harrysally则属于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]                                              //仓库testtrunk目录的访问权限 

   @g_pm = rw                                               //g_pm组用户具有读和写权限,@开头的表示群组设置

   @g_dev = rw                                              //g_dev用户具有读写权限 

 

   [test:/branches]                                        //仓库testbranches目录下的访问权限 

   @g_pm = rw                                               //g_pm组用户具有读和写权限,@开头的表示群组设置

   @g_dev = rw                                              //g_dev用户具有读写权限

 

   [test:/tags]                                                //仓库testtags目录下的访问权限 

   @g_pm = rw                                               //g_pm组用户具有读和写权限,@开头的表示群组设置

   @g_dev = rw                                              //g_dev用户具有读写权限

 

 

如果需要对某个用户授权,可以这么写:

   [test:/branches]                                        //仓库testbranches目录下的访问权限 

   sally = r                                                      //sally用户具有读权限

 

当然,这样的authz文件显得很繁琐,而且没有必要,但是这样的配置在需求出现变化的时候将会很容易修改。

 

不要忘记将authz文件的所有者改为apache,并且将其权限设为700

再用浏览器访问:http://serverIP/svn/project01  

用svn client软件去checkout :   推荐小乌龟:tortoiseSVN  个人觉得蛮好用的~

排错注意几点:

1.运行apache的用户是否有权限去控制svn的根目录(项目目录).

2.查看apache错误日志./usr/local/server/apache2/logs/error_log 

 

备份:备份有很多种方法,svnadmin 有dump,hotcopy。。。但我觉得最简单也最好用的应该就是直接将版本库备份起来。用这个方法就又多了,用rsync甚至用cp之类数据备份的方法。

还原:如果直接备份版本库的话,就只要将apache的配置文件里加一段对应的"<Location>",前提是subversion,和apache环境都已经有了。但要注意目录的权限问题。还原过来的版本库在新的环境中属主和属组是否是apache的主用户。