@ZEAL Blog·厉
WWW Zeal Blog
We stand alone,
TOGETHER.

SVN 初体验

Posted by zeal on 2006-04-18 18:20 , 2217 characters |  + 2 - 0   English
转载请保留本行原始出处声明信息 : http://www.zeali.net/entry/359 MaDe1nZEAL
标签 ( 开发/理论 ):

要在新服务器上装版本控制系统了。本来打算和以前一样用 CVS 来进行源代码管理,碰巧看到 duduwolf 对 SVN 大力推荐,加上这篇文章对于各种版本控制系统功能的完整比较,一直为 CVS 的各种缺陷感到郁闷的我自然毫不犹豫投奔了 SVN 的怀抱。

安装过程算不上一帆风顺,但我不打算在这里写出一篇完整的安装手册来,只简单记录几点体会。

服务模式

SVN 可以通过内置的 svnserve 提供服务,也可以和 Apache 配合通过标准的 http/https 来提供服务。用 svnserve 的好处是配置相对简单,但不足是 svnserve 所能提供的权限管理最小粒度只能到版本库(和 CVS 一样)。这对于开源软件的开发使用可能问题不大,但对于用作公司内部源代码控制来说就太简单了。所以我选择用 Apache + SSL + SVN 。

当初使用 CVS 最让我觉得美中不足的就是它的目录权限控制。因为针对每个用户只能控制其访问整个版本库的读写权限,以至于我不得不创建了N个独立的版本库。即便这样,每个版本库下面还是有许多项目是希望能分别控制权限的。当时采用的方法是禁用了CVS的目录浏览功能,并对每个项目目录名增加随机编号。只有知道确切的目录名称才可以访问到该项目。现在既然改用 SVN ,如果还是无法对版本库里面的每一个子目录进行精确的权限控制的话,还不如用 CVS 。通过配置AuthzSVNAccessFile文件来控制每一个项目目录的访问权限虽然算不上特别方便,但总比 CVS 那样完全没办法好。

数据存储

SVN 同样可以使用两种数据存储方式: Berkeley DB 和 FSFS 。在我看来, Berkeley DB 的优势在于其成熟性,但需要更多的日常管理和维护,并且是平台依赖的。所以我选择更简便的 FSFS 。

APR libraries

安装 SVN 的时候最好指定 --with-apr=  和 --with-apr-util= 参数到 Apache 安装的根目录(ServerRoot)下,而不是使用缺省的 SVN 安装包中自带的 apr 。否则如果你安装的 Apache 版本不同有可能导致 APR 库不匹配,出现类似 Can't set position pointer in file '/svn/test/db/revs/1': Invalid argument 的错误。Updated 2006-04-20 16:30 -- 比如说如果你安装的是apache 2.2.0版本,就需要在编译安装svn的时候指定--with-apxs和--with-apr参数到你的apache2.2.0安装目录下:
./configure --prefix=${subversionInstallFolder} /
--with-apxs=${apacheInstallFolder}/bin/apxs /
--with-apr=${apacheInstallFolder} /
--with-apr-util=${apacheInstallFolder} /
--with-ssl /
--with-zlib /
--enable-maintainer-mode

make clean && make && make install

签署证书

既然是公司内部的源码控制系统,通过 SSL 来加密保护登录信息还是很有必要的。证书的制作所填写的信息其他都关系不大,只要注意生成根证书和服务器请求签证文件时的两次 Common Name 不能一样(理论上Common Name 应该是用户将会用来访问的完整域名字符串),否则会导致证书生成的时候出现 error 18 at 0 depth lookup:self signed certificate 错误。

Updated 2006-06-29 12:52 -- 似乎还是有不少朋友在安装svn的时候碰到各种各样的问题,所以我把自己用来进行 svn server 恢复的完整脚本提供给大家下载( 点击下载 svn_recover.rar 13,473 字节),仅供大家参考。需要说明的几点:

  1. 不要直接运行 reinstall.sh 脚本。因为这个脚本是针对我自己的 svn 服务器的情况来写的,目的是在重装服务器的时候可以完全实现自动化。所以如果你不去了解脚本的实际工作就放服务器上执行,由此造成的任何后果我可不负责 :)
  2. 我的 svn server 不需要提供其他的服务,所以我的安装脚本是完全以 svn 服务为中心的,如果你的服务器还需要提供 php / mysql 等服务的话,这个脚本可能并不适合你。
  3. 为了 recover 的方便,我把 svn 所需要的一些关键文件放在了 resource 目录下面,安装脚本自动从 resource 目录下读取相关的文件拷贝到对应的目标目录下。你如果想用这个脚本,需要在 resource 目录下提供你自己服务器环境下的真实文件。本压缩包中的资源文件仅作示例。

Last Modified on 2007-05-28 12:25
14 条评论:
- wanghua2006-04-19 13:34
老厉现在去哪里了?
- zeal (link) 于 2006-04-19 17:47
在上海呆着呢,呵呵。痛并快乐着。
- reaking () 于 2006-04-20 15:50
zeal,搜索了整个google才找到你这篇文章,真是太好了。
你提到多个apr库会导致冲突,但是细节不太清楚,我非常需要这方面的帮助。能msn沟通一下吗?
- zeal (link) 于 2006-04-20 16:28
比如说如果你安装的是apache 2.2.0版本,就需要在编译安装svn的时候指定--with-apxs和--with-apr参数到你的apache2.2.0安装目录下:
./configure --prefix=${subversionInstallFolder}
--with-apxs=${apacheInstallFolder}/bin/apxs
--with-apr=${apacheInstallFolder}
--with-apr-util=${apacheInstallFolder}
--with-ssl
--with-zlib
--enable-maintainer-mode

make clean && make && make install
- reaking2006-04-20 19:31
老厉,谢谢了。
我还是没有搞定,用ldd命令发现libapr库并不冲突。
当我不启动svnserve服务,仅仅启动apache服务,无权访问http://192.168.0.100/svn目录。
启动svnserve服务后,仍然无法访问http://192.168.0.100/svn目录。阅读a..
用ps -A发现svnserve进程在列表中,那么svnserve守护的ip和端口有问题吗?
如果浏览器中输入http://192.168.0.100:3690,则出现“.. success ( 1 2 ( ANONYMOUS ) ( edit-pipeline ) ) ) ”,用http://192.168.0.100:3690/svn,提示..
另外linux下svn对应的目录权限是755,方法已经使尽了。
厉兄还有高招吗? 麻烦通知兄弟一声。 谢谢了。
- zeal (link) 于 2006-04-21 11:31
apache的http访问方式和svnserve方式是无关的。实际上我现在根本就没有配置启动svnserve服务,只通过apache来访问。或者你尝试把apache的user/group改成svn的用户组看看。
- jizp () 于 2006-06-07 11:33
我也是建好后不能访问,说是没权限“您可能没有权限用您提供的凭据查看此目录或网页。”。什么问题????
急!!!!!!!!!谢谢!!!!!
- zeal (link) 于 2006-06-07 11:55
权限问题一般还是apache的配置问题。具体问题只能具体去分析了。祝好运。
- taburiss2006-06-28 18:04
我安装的是apache 2.2.2
./configure --prefix=/usr/local/svn --with-apxs=/usr/local/apache2/bin/apxs --with-apr=/usr/local/apache2 --with-apr-util=/usr/local/apache2 --with-ssl --with-libs=/usr/local/openssl --with-zlib--enable-maintainer-mode --with-berkeley-db=/usr/local/BDB
编译之后会出现下面的信息
Now run 'make' to compile the neon library.

neon configured properly
checking for any extra libraries neon needs... -L/usr/local/openssl/lib -L/usr/local/svn/lib -lz -L/usr/kerberos/lib -lssl -lcrypto -lgssapi_krb5 -lkrb5 -lcom_err -lk5crypto -lresolv -ldl -lz -L/usr/kerberos/lib -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lxml2 -lz -lpthread -lm
checking for static Apache module support... no
checking for Apache module support via DSO through APXS... found at /usr/local/apache2/bin/apxs
checking httpd version... recent enough
checking for socket in -lsocket... no
configure: error: APR-UTIL was installed independently, it won't be
possible to use the specified Berkeley DB: /usr/local/BDB

但如果我把--with-apr-util=/usr/local/apache2的选项去掉后虽然编译的时候不会报错,但是在make的时候却会出现error
如下:
libtool: link: warning: `/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../..//libgdbm.la' seems to be moved
libtool: link: warning: `/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../..//libdb-4.1.la' seems to be moved
libtool: link: warning: `/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../..//libexpat.la' seems to be moved
libtool: link: warning: `/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../..//libgdbm.la' seems to be moved
libtool: link: warning: `/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../..//libdb-4.1.la' seems to be moved
libtool: link: warning: `/usr/lib/gcc-lib/i386-redhat-linux/3.2.3/../../..//libexpat.la' seems to be moved
/bin/sh /root/gforge/subversion-1.2.1/libtool --tag=CC --silent --mode=compile gcc -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -g -O2 -g -O2 -pthread -DNEON_ZLIB -DNEON_SSL -I./subversion/include -I./subversion -I/root/gforge/subversion-1.2.1/neon/src -I/usr/local/svn/include/neon -I/usr/local/apache2/include -I/root/gforge/subversion-1.2.1/apr-util/include -I/usr/local/BDB/include -o subversion/libsvn_fs_base/bdb/bdb-err.lo -c subversion/libsvn_fs_base/bdb/bdb-err.c
In file included from subversion/libsvn_fs_base/bdb/bdb-err.c:30:
subversion/libsvn_fs_base/fs.h:75: syntax error before "DB_ENV"
subversion/libsvn_fs_base/fs.h:75: warning: no semicolon at end of struct or union
subversion/libsvn_fs_base/fs.h:78: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:79: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:79: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:80: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:80: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:81: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:81: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:82: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:82: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:83: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:83: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:84: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:84: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:85: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:85: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:86: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:86: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:87: syntax error before '*' token
subversion/libsvn_fs_base/fs.h:87: warning: data definition has no type or storage class
subversion/libsvn_fs_base/fs.h:102: syntax error before '}' token
subversion/libsvn_fs_base/fs.h:102: warning: data definition has no type or storage class
subversion/libsvn_fs_base/bdb/bdb-err.c: In function `bdb_err_to_apr_err':
subversion/libsvn_fs_base/bdb/bdb-err.c:44: `DB_LOCK_DEADLOCK' undeclared (first use in this function)
subversion/libsvn_fs_base/bdb/bdb-err.c:44: (Each undeclared identifier is reported only once
subversion/libsvn_fs_base/bdb/bdb-err.c:44: for each function it appears in.)
subversion/libsvn_fs_base/bdb/bdb-err.c: In function `svn_fs_bdb__dberr':
subversion/libsvn_fs_base/bdb/bdb-err.c:60: warning: passing arg 3 of pointer to function makes pointer from integer without a cast
subversion/libsvn_fs_base/bdb/bdb-err.c: In function `svn_fs_bdb__wrap_db':
subversion/libsvn_fs_base/bdb/bdb-err.c:89: `bfd' undeclared (first use in this function)
make: *** [subversion/libsvn_fs_base/bdb/bdb-err.lo] Error 1

请问是怎么回事
- zeal (link) 于 2006-06-28 18:23
我一直使用的都是 svn 的 FSFS 数据存储方式,没试过编译 Berkeley DB 方式。可以这两者之间存在一些编译参数上的差异。
- taburiss2006-06-29 08:51
给个安装步骤参考一下可以吗。网上的内容不太多,我是找了很多相关的内容后自己试着安装的,但是安装之后apache也找不到SVN的模块,无法支持SVN的服务。
- zeal (link) 于 2006-06-29 13:09
我把自己安装所用的脚本附在本文最后了,仅供各位参考。其实linux环境下的服务安装不像windows那样傻瓜,每个人的服务器环境也多少会有些差异。真正百试百灵的安装手册确实难找。只能靠大家自己去摸索和积累经验了:)
- taburiss2006-06-30 08:47
OK
多谢了
- pq2006-08-22 10:45
”CVS 最让我觉得美中不足的就是它的目录权限控制,“, 有个CVS的插件or补丁可以实现。 你可以搜索一下。
日志存档
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
本 Blog 原创内容
遵循以下授权:

Creative Commons
(创作共用) CC

署名-非商业性
-相同方式分享
ZEAL Blog 基于
Powered byPivot - 1.24.1: 'Arcee'
Pivot1.24.1
开发
系统部署于
Linode.com
Launched @
2005-04-27
Since 2005.04.27  梦想 就像鸡蛋 要么孵化 要么臭掉RSS Feed (Entries) | About me | Back To Home | @ZEAL | zbird.com | 沪ICP备05024379号