最近计划把SVN仓库从Windows迁移Linux平台,原来的AD验证不能用,也不想再用了--用户要登录到域才能修改个人密码,太麻烦了


比较过多样SVN仓库管理软件后,决定使用SVNManager,它的安装文档和过程都比较简单,但有一些特殊情况网上的其它信息处理得并不正确。


安装过程: (基于debian lenny)
1. 安装必要的包
   apt-get install subversion libapache2-svn
   apt-get install apache2 php libapache2-mod-php5 mysql-server
   apt-get install php-pear php-xml-parse
   注:RHEL/CentOS用yum 代替apt-get, apache2在RHEL中名字是httpd, 类似差异要灵活变通

2.升级php-pear和安装必要的包
   pear channel-update pear.php.net (如果直接安装没提示,则可选)
   pear install VersionControl_SVN
   #这些在SVNManager安装文档中都有提及
   #另:我实在很厌恶那些安装文档中一大堆的make && make install, 以为用tarball安装httpd, php, mysql这些软件很cool, 文章篇幅主次不分~
   #注:debian 可以安装sysv-rc-conf对系统启动时的运行哪些服务进行控制

3.安装SVNManager
  http://svnmanager.sourceforge.net/
  当前(2009-9-17)最新版本1.0.8, linux下载tar包
  把压缩包解压到自己希望的位置...
  注:位置可以是www根,也可以虚拟主机的某个Alias, 具体请自行研究apache配置,在debian中www根是/var/www, 在RHEL中,www根是/var/www/html

4.准备数据库和文件系统
  1)准备存储svn仓库的文件系统,比如/opt/svnrepo
    文件系统属主要修改为apache进程的用户名
    debian下是www-data 用ps -ef | grep apache 显示
    RHEL下是apache, 用ps -ef | grep httpd 显示
    比如:chown www-data:www-data /opt/svnrepo

  2)准备存储配置数据的mysql数据库(用sqllite据说也行,没测试)
    mysql -u root -p
    >create database svnmanagerdb CHARACTER SET utf8 ;
    >有兴趣的话,单独创建个专用用户会比用root要安全, 请参考mysql资料

5.修改SVNManager的config.php
  cp config.php.linux config.php 从模板创建配置文件.

关键内容如下:
  $lang  = "en_US.UTF-8";

  $htpassword_cmd              =       "/usr/bin/htpasswd";
  $svn_cmd                     =       "/usr/bin/svn";
  $svnadmin_cmd                =       "/usr/bin/svnadmin";

//Subversion locations
$svn_config_dir         =       "/opt/svnrepo/svnconfig";
$svn_repos_loc          =       "/opt/svnrepo";
$svn_passwd_file        =       "/opt/svnrepo/svn-repos_passwdfile";
$svn_access_file        =       "/opt/svnrepo/svn-repos_accessfile";

$smtp_server            =       "";没有就为空

$dsn   = "mysqli://dbuser:password@localhost/svnmanagerdb";

6.修改apache的配置文件
在默认或相应虚拟主机中加下如下内容

        DAV svn
        SVNParentPath /opt/svnrepo
        SVNReposName "Subversion Repository"
        AuthType Basic
        AuthName "subversion repos user"
        AuthUserFile /opt/svnrepo/svn-repos_passwdfile
        Require valid-user
        #SSLRequireSSL
        AuthzSVNAccessFile /opt/svnrepo/svn-repos_accessfile

访问路径就是http://virtualhost/svn/repo_name


几个疑难点的处理:
1.进入Repository Admin 菜单时页面提示:skip setlocale() failed, unicode characters might fail!

  网上有资料的处理办法是修改$lang = "zh_CN.GBK";
  其实这是个表面解决办法,实质上这个是跟php的setlocale函数和操作系统libc库支持的locale有关.
  RHEL把几乎所有的locale都在系统中准备好了
而debian则只准备需要的几样
  为尽可能少修改软件,并支持utf8编码(也就支持中文了),作如下处理:
  在debian系统中,可以把en_US.UTF-8的locale生成好,方法如下:
  vi /etc/locale.gen    把en_US.UTF-8前面的注释号去掉
  保存后,执行locale-gen
  可能要安装locales包,请apt-get install之
  在RHEL中,用locale -a | grep en_US显示其正确名称(en_US.utf8),填写到$lang变量中

2.新建/编辑用户时总是提示Invalid e-mail address!
  这有两个原因:
  1.php pear库中 XML_Parser 和VersionControl_SVN两个包安装不正确(网上资料)
  2.php框架prado的原因,会强制验证邮件地址域对应DNS中的MX记录,如果乱填邮件地址或者是网络问题或者DNS问题,都会导致这个非法邮件提示,很让人头大。

  解决办法:
  1.重装相关包
  2a.确保邮件地址正确,邮件域有MX记录,DNS工作正常~
  2b.修改/svnmanager/UserModule/AddPage.tpl删除 com:TEmailAddressValidator标签

3.中文用户名支持(虽然不建议这么做)
  网上很多资料说的,又要改/etc/my.cnf, 又要修改源码mysql连接代码,在连接数据库时加一句set char之类的...
  这些做法都是多余的!
  只需要两点:
  1.在创建数据库时使用utf8编码
  2.$lang使用utf8编码的locale, 比如en_US.UTF-8, zh_CN.UTF-8(en_US.utf8)等

  注:在有仓库访问控制时,中文用户名和组名会造成访问制作,估计是某些地方的编码解码不一致造成的,建议避免使用中文用户名


使用过程注意事项:
1.开始时建议马上生成一个admin账号,覆盖内置的admin帐号,并重新登录
2.功能很简单也很实用,不过有些功能很古怪,比如用户可以修改用户名,而存取控制又是跟用户名有关的,所以修改用户名后,肯定要重新设定一次仓库访问权限
3.仓库文件中如果有中文路径的话,在仓库访问控制界面会出错,要避免之.


最佳参考资料:
http://blog.chinaunix.net/u2/88936/showart_1728225.html