🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# SVN服务器搭建 [TOC] >[info] svn(subversion)是今年来崛起的版本管理工具,与CVS一样,SVN是一个跨平台的开源的版本控制系统,Subversion管理着随时间改变的数据,这些数据放置在一个中央资料档案库(repository)中。 这个档案库很像一个普通的文件服务器,不过**它会记住每一次文件的变动**。这样就可以把档案恢复旧的版本,或是浏览文件的变动历史。 SVN是一个通用的软件系统,它不但可以用来管理程序源码,他也可以管理任何类型的文件,如文本、视频,图片等等。 **以下为步骤总结** 1. 安装svn服务器 `yum -y install subversion` 2. 创建svn服务器目录 `mkdir -p /opt/svn/svndata /opt/svn/svnpasswd` 3. 启动svn服务器 `svnserve -d -r /opt/svn/svndata` 4. 创建一个新的svn项目 `svnadmin create /opt/svn/svndata/app` 5. 更改主配置文件并指定权限和用户名密码配置文件 6. 配置用户和用户、用户组权限 7. 重启svn服务器 8. 使用客户端连接测试 相关站点: http://subversion.tigris.org/ http://subversion.apache.org/ http://tortoisesvn.net/ ## SVN服务运行模式与访问方式 ### SVN服务端运行方式 svn服务器常见的有三种运行访问方式: 1. 独立服务器(例如:**svn**://svn.blogcurder.com/document) 2. 借助apache(例如:**http**://svn.blogcurder.com/document) 3. 本地直接访问(例如:**file**:///svn.blogcurder.com/document) ### SVN数据格式 svn存储版本数据也有2种方式:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全些。 SVN是基于关系数据库的(BerkleyDB)或一些列二进制文件的(FSFS)。一方面这解决了许多问题(例如:并行读写共享文件)以及添加了许多新功能(例如运行时的事务特性),然而另一方面,数据存储由此变得不透明。 ### 集中式版本管理系统 集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交代码。所以的版本信息都放在服务器上。如果脱离了服务器,开发者就无法工作。 **缺点** 1. 服务器压力大,svn数据库容量暴增 2. 如果不能连接到服务器上,就不能提交、还原、对比等。 3. 不适合开源开发,但是一般集中式管理的有非常明确的权限管理机制,可以实现分层管理,从而很好的解决开发人数众多的问题。 **优点** 1. 管理方便,逻辑明确,符合一般人思维习惯。 2. 易于管理,集中式服务器更能保证安全性。 3. 代码一致性非常高。 4. 适合开发人数不多的项目开发 5. 大部分软件配置管理的大学教材都使用svn。 ## 安装配置SVN ### 查看系统环境 ~~~ [root@localhost.localdomain /etc/yum.repos.d] # cat /etc/redhat-release CentOS release 6.7 (Final) [root@localhost.localdomain /etc/yum.repos.d] # uname -m x86_64 [root@localhost.localdomain /etc/yum.repos.d] # uname -r 2.6.32-573.7.1.el6.x86_64 [root@localhost.localdomain /etc/yum.repos.d] # uname -a Linux localhost.localdomain 2.6.32-573.7.1.el6.x86_64 #1 SMP Tue Sep 22 22:00:00 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux ~~~ ### 安装SVN ~~~ # yum安装rpm包安装后本地不清除的方法 [root@localhost.localdomain /etc/yum.repos.d] # sed -i 's#keepcache=0#keepcache=1#g' /etc/yum.conf [root@localhost.localdomain /etc/yum.repos.d] # grep keepcache /etc/yum.conf keepcache=1 # 使用yum安装svn [root@localhost.localdomain /etc/yum.repos.d] # yum -y install subversion # 检查是否已安装 [root@localhost.localdomain /etc/yum.repos.d] # rpm -qa subversion subversion-1.6.11-15.el6_7.x86_64 ~~~ ### 配置并启动SVN #### 建立svn版本库根目录(svndata)以及密码权限目录(svnpasswd) `mkdir -p /opt/svn/svndata /opt/svn/svnpasswd` #### 指定服务的svn根目录启动svn服务 `svnserve -d -r /opt/svn/svndata` #### 查看svn服务帮助 ~~~ [root@localhost.localdomain /opt/svn] # svnserve --help 用法: svnserve [-d | -i | -t | -X] [options] 有效选项: -d [--daemon] : 后台模式 -i [--inetd] : inetd 模式 -t [--tunnel] : 隧道模式 -X [--listen-once] : 监听一次方式(调试用) -r [--root] ARG : 服务的根目录 -R [--read-only] : 强制只读;覆盖版本库配置文件 --config-file ARG : 从文件 ARG 读取配置 --listen-port ARG : 监听端口 [方式: daemon, listen-once] --listen-host ARG : 监听主机名称或IP地址 [方式: daemon, listen-once] -T [--threads] : 使用线程代替进程 [方式: daemon] --foreground : 在前台运行(调试用) [方式: daemon] --log-file ARG : svnserve 日志文件 --pid-file ARG : 写进程 PID 到文件 ARG [方式: daemon, listen-once] --tunnel-user ARG : 隧道用户名(默认是当前UID对应的用户名) [方式: tunnel] -h [--help] : 显示本帮助 --version : 显示程序版本信息 ~~~ #### 查看进程和端口 ~~~ [root@localhost.localdomain /opt/svn] # ps -ef |grep svn|grep -v grep root 2767 1 0 15:59 ? 00:00:00 svnserve -d -r /opt/svn/svndata/ [root@localhost.localdomain /opt/svn] # netstat -tunpl|grep svnserve tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2767/svnserve # 或者 [root@localhost.localdomain /opt/svn] # lsof -i tcp:3690 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME svnserve 2767 root 3u IPv4 37535 0t0 TCP *:svn (LISTEN) ~~~ ## 建立版本库 ### 创建一个新的Subversion项目**`app`** ~~~ [root@localhost.localdomain /opt/svn] # svnadmin create /opt/svn/svndata/app [root@localhost.localdomain /opt/svn] # ls -l /opt/svn/svndata/app/ 总用量 24 drwxr-xr-x. 2 root root 4096 10月 13 16:23 conf drwxr-sr-x. 6 root root 4096 10月 13 16:23 db -r--r--r--. 1 root root 2 10月 13 16:23 format drwxr-xr-x. 2 root root 4096 10月 13 16:23 hooks drwxr-xr-x. 2 root root 4096 10月 13 16:23 locks -rw-r--r--. 1 root root 229 10月 13 16:23 README.txt ~~~ ### 查看帮助方法 ~~~ [root@localhost.localdomain /opt/svn] # svnadmin help 一般用法: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...] 使用“svnadmin help <subcommand>” 得到子命令的帮助信息。 使用“svnadmin --version”查看程序的版本号和文件系统模块。 可用的子命令: crashtest create ~~~ #### 查看具体参数帮助 ~~~ [root@localhost.localdomain /opt/svn] # svnadmin help create create: 用法: svnadmin create REPOS_PATH 在 REPOS_PATH 创建一个新的空版本库。 有效选项: --bdb-txn-nosync : 在提交事务时禁用fsync [BDB] --bdb-log-keep : 禁用自动删除日志文件 [BDB] --config-dir ARG : 从目录 ARG 读取用户配置文件 ~~~ ### 配置用户对app项目允许读写访问 ~~~ # 修改前养成备份的好习惯 [root@localhost.localdomain ~] # cd /opt/svn/svndata/app/conf && cp svnserve.conf svnserve.conf.$(date +%F) # 修改前先查看下 [root@localhost.localdomain /opt/svn/svndata/app/conf] # egrep '\-access|\-db =' svnserve.conf # anon-access = read # auth-access = write # password-db = passwd # authz-db = authz # 使用vim命令对文件进行修改 anon-access = none # 文件12行处 auth-access = write # 文件13行处 password-db = /opt/svn/svnpasswd/passwd # 文件20行出 authz-db = /opt/svn/svnpasswd/authz # 文件27行出 # 修改完后检查 [root@localhost.localdomain /opt/svn/svndata/app/conf] # egrep '\-access|\-db =' svnserve.conf anon-access = none auth-access = write password-db = /opt/svn/svnpasswd/passwd authz-db = /opt/svn/svnpasswd/authz ~~~ ### 修改用户权限 #### 新增用户名和密码 ~~~ # 拷贝用户权限和密码配置文件 [root@localhost.localdomain /opt/svn/svndata/app/conf] # cp authz /opt/svn/svnpasswd/ [root@localhost.localdomain /opt/svn/svndata/app/conf] # cp passwd /opt/svn/svnpasswd/ [root@localhost.localdomain /opt/svn/svndata/app/conf] # ls /opt/svn/svnpasswd/ authz passwd # 编辑密码文件 [root@localhost.localdomain /opt/svn/svnpasswd] # cd /opt/svn/svnpasswd && vim passwd #添加一下几个测试用户 rose = aaaaaa luozhiqun = aaaaaa guest = aaaaaa test = aaaaaa ~~~ >[danger] `=`前面为svn用户帐号,`=`后面为用户密码,密码是明文密码,注意修改文件权限,例如: `chmod 600 passwd`。 更改svnserve.conf时,需要重启SVN服务器,更改authz和passwd文件时不需要重启。 #### 编辑权限文件 ~~~ [root@localhost.localdomain /opt/svn/svnpasswd] # vim authz 其中 [groups] 下方是定义组信息,注意:用户帐号在passwd文件中。 配置规则为 :组名 = 用户名 其中用户名为passwd文件中存在的用户 例如添加如下内容: develpeople = rose,luozhiqun testpeople = test [app:/] # 对项目app进行权限控制 @develpeople = rw # devel组对app项目的根有读写权限 @testpeople = r # test组对app项目有只读权限 guest = r # guest用户对app项目有只读权限 ~~~ >[danger] **注意:** 权限没有`x`,复制上述代码时请删除注释!(可能导致授权失败) ## 重启svnserve进程 ~~~ pkill svnserve svnserve -d -r /opt/svn/svndata ~~~ # 客户端连接SVN服务器 使用checkout指令检出**app**项目 输入 `svn://192.168.1.169/app`进行检出操作,如果提示输入用户名和密码 则表示连接svn服务器成功。如果不成功检查服务器`iptables`和`selinux`是否拦截了连接请求。 复选框能让TortoiseSVN在subversion的缺省目录:`cmd`敲入`%APPDATA%\Subversion\auth`打开的三个子目录内保存认证信息: * svn.simple 里面包含了基本认证方式所需要的认证信息(用户名/密码),保存的密码是通过WinCrypt API加密的,不是文本形式。 * svn.ssl.server 里包含了SSL服务器证书 * svn.username 里面包含了用户名认证的认证信息(无须提供密码) ## 监视SVN提交的工具 ### 下载地址 `http://www.softpedia.com/get/Tweak/System-Tweak/CommitMonitor.shtml#download` 下载解压后,打开程序窗口,新建product输入: ~~~ Product name url to monitor check every 1 minutes username password ~~~ 等信息,然后隐藏到任务栏,这样有更新软件会有反馈。