创建SVN同步镜像

最近有一部分技术需要出差。需要访问公司内网的SVN。直接开放SVN的外网访问权限,是个办法,但是SVN资源都很大,每次都走外网访问速度会很慢。而且,出差期间,只需要只读权限。所以,我做的解决方案是在出差的地方搭一个局域网,然后局域网内做一个公司内网的SVN server镜像。

主要参考这篇文章 SVN实时同步备库方法,下面步骤不多说了。记录一下大致的shell命令。

mkdir -p /data/work/svn/
cd /data/work/svn
svnadmin create reponame
cd /data/work/svn/reponame/hooks/
mv pre-revprop-change.tmpl pre-revprop-change
sed -i '/exit 1/d' pre-revprop-change
chmod +x pre-revprop-change

cd /data/work/svn/reponame/
# 做一些基本的权限配置。这里要创建一个对svn主库有访问权限的账号,密码保持一致。
vi conf/svnserve.conf
vi conf/authz
vi conf/passwd

sudo mkdir -p /var/log/svn
/usr/bin/svnserve -d -r /data/work/svn/ --log-file /var/log/svn/svn.log

# 本地的svn镜像库已经创建好了

# 开始设置同步
svnsync init svn://127.0.0.1/reponame svn://svn.internal.com/reponame --username=xxx --password=xxx --no-auth-cache

# 开始同步
svnsync sync svn://127.0.0.1/reponame --username=xxx --password=xxx --no-auth-cache

遇到几个的问题

  1. 首次同步的时候,内容比较多(50GB+),中途网络出现问题,同步进程hung住了。只好杀死进程再来。然而再次同步时,命令行报错:

    Failed to get lock on destination repos, currently held by ‘client.internal.com:b77f31da-4af9-46b3-a172-54dcbae4eaac’

    google之,解决访问见 svnsync-couldnt-get-lock-on-destination-repos,命令行参数中加入--steal-lock

     svnsync sync svn://127.0.0.1/reponame --username=xxx --password=xxx --no-auth-cache --steal-lock
    
  2. 因为首次同步时数据较多,我是走的内网地址(svn://svn.internal.com/reponame)同步。而后续出差时,镜像库需要走公司公网(svn://svn.external.com/reponame)来同步SVN。所以,需要切换镜像库同步时使用的主库URL。方法见how-to-change-svn-url-in-svnsync

     echo -n "svn://svn.external.com/reponame" > /tmp/url
     svnadmin setrevprop /data/work/svn/reponame/ -r0 svn:sync-from-url /tmp/url 
     svnlook pg --revprop -r0 /data/work/svn/reponame/ svn:sync-from-url
    
  3. 在出差地搭建局域网时,镜像库SVN的内网IP是192.168.0.1,我在局域网内设置DNS解析,将svn.internal.com域名指向192.168.0.1。同时,我将SVN主库的账号密码也同步到SVN镜像库里,设置所有人对镜像库的权限为只读(除了同步数据所用的syncuser)。这样,出差的同事,可以不修改任何配置,直接更新SVN。但实际操作时,发现报错:

     > svn update -r 12275
     Updating '.':
     svn: E170009: Repository UUID 'e0ee040f-cdad-4e5f-abbd-90169ed1c880' doesn't match expected UUID '002130f5-581a-4177-addd-ae2a9abc5565'
    

    然后又google之,找到了设置仓库uuid的方法:svn.reposadmin.maint.uuids

     svnadmin setuuid /data/work/svn/reponame/ 002130f5-581a-4177-addd-ae2a9abc5565
    
  4. os x如何从命令行查看网络带宽

     nettop -n -m route
    

Comments