以下我所用到的软件(版本需要注意一下,因为版本差异配置什么也有可能会有差异):
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失败
安装apr和apr-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]#
验证一下,用浏览器访问一下apache的IP,出现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的新文件夹,包含trunk、branches、tags三个子目录,目录结构如下图所示。
至于为什么这么做,大家可以参考Version Control with Subversion第4章。
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,确保将User和Group设置为
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/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。
再用浏览器访问: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的主用户。
转载于:https://blog.51cto.com/moonsilver/397152