1. SVN介绍
1.1. 简介
SVN(subversion),版本管理工具,与CVS一样,SVN是一个可跨平台的开源版本控制系统,Subversion管理随时间变化的数据。这些数据都被放置在一个档案库(repository)中,它会记录每一次文件的变动,这样我们就可以把档案恢复到旧的版本或者浏览文件的变动记录。除了能够存放程序代码外还可以管理其他任何类型的文件,如文本,视频,图片。
Subversion官网:https://subversion.apache.org
SVN客户端:http://tortoisesvn.sourceforge.net/
SVN中文网站:http://svndoc.iusesvn.com/
1.2. Svn服务端运行方式
常见的运行方式有以下3种:
- a、独立服务器,例如:svn://svn.petrochina.org/sadoc
- b、借助apache,例如:http://svn.petrochina.org/sadoc
- c、本地直接访问,例如:file:///application/svndata/sadoc
1.3. Svn客户端访问方式
访问方式 | 说明 |
file:/// | 直接通过本地磁盘或者网络磁盘访问版本库 |
http:// | 通过WebDAV协议访问支持Subversion的Apache服务器 |
https:// | 与http://相似,但是用SSL加密访问 |
svn:// | 通过TCP/IP自定义协议访问是SVN服务器 |
svn+ssh:// | 通过认证并加密的TCP/IP自定义协议访问svn服务器 |
1.4. SVN数据格式
svn存储版本数据有2种方式。BDB(事务安全型表类型)和FSFS(不需要数据库的存储系统)。由于BDB方式在服务器中断时有可能锁住数据,所以还是FSFS方式更安全一点。CVS是基于RCS文件的版本控制系统,每个CVS文件都不过是普通的文件加上一些额外的信息,这类文件会简单重复本地文件的树结构。因此不必担心数据损失,必要的话可以手工修改RCS文件。而SVN是基于关系数据库或一系列二进制文件的(FS_FS),这解决了许多问题(如并行读写共享文件)以及添加了许多新功能,但是数据存储也由此变的不透明。
1.5. SVN系统逻辑架构图
1.6. 中央式管理的工作流程
这种结构的核心是Server,所有开发人员在工作前要先去服务器端获取代码-->开发-->解决冲突-->提交至服务器。如果脱离了服务器就无法正常工作。
1.7. 运维人员对版本管理系统需要掌握的
- 安装、部署、维护、排障
- 简单使用,很多公司都是由开发来管理,包括建立仓库和添加删除账号
- 对于版本控制系统,运维人员要相当于开发商,开发人员是业主,运维搭建的系统为开发人员服务
2. 安装配置
2.1. 系统环境
CentOS release 6.6 (Final) 2.6.32-504.el6. x86_64
2.2. 安装svn
由于是内部应用,故用yum安装即可。
yum install subversion –y
检查
rpm -qa subversion subversion-1.6.11-15.el6_7.x86_64
2.3. 配置启动
建立svn版本库根目录svndata,密码权限目录svnpasswd。
[root@svn ~]# mkdir -p /application/{svndata,svnpasswd} [root@svn ~]# tree /application/svn* /application/svndata /application/svnpasswd 0 directories, 0 files
启动svn服务指定服务的svn根目录
[root@svn ~]# svnserve -d -r /application/svndata/ -d dameon模式
查看svnserver命令帮助
[root@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 : 显示程序版本信息
查看svn进程
[root@svn ~]# ps -ef |grep svn root 2925 1 0 00:51 ? 00:00:00 svnserve -d -r /application/svndata/ root 2949 2754 0 00:58 pts/0 00:00:00 grep --color=auto svn [root@svn ~]# ps -ef |grep svn|grep -v grep root 2925 1 0 00:51 ? 00:00:00 svnserve -d -r /application/svndata/
检查svn端口
[root@svn ~]# netstat -lntup|grep svn tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2925/svnserve [root@svn ~]# netstat -lntup|grep 3690 tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 2925/svnserve [root@svn ~]# lsof -i tcp:3690 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME svnserve 2925 root 3u IPv4 22216 0t0 TCP *:svn (LISTEN)
2.4. 建立版本库
创建一个新的subversion项目(版本库)sadoc,
[root@svn ~]# svnadmin create /application/svndata/sadoc [root@svn ~]# ll /application/svndata/sadoc 总用量 24 drwxr-xr-x. 2 root root 4096 11月 12 01:02 conf drwxr-sr-x. 6 root root 4096 11月 12 01:02 db -r--r--r--. 1 root root 2 11月 12 01:02 format drwxr-xr-x. 2 root root 4096 11月 12 01:02 hooks drwxr-xr-x. 2 root root 4096 11月 12 01:02 locks -rw-r--r--. 1 root root 229 11月 12 01:02 README.txt
查看帮助
[root@svn ~]# svnadmin help 一般用法: svnadmin SUBCOMMAND REPOS_PATH [ARGS & OPTIONS ...] 使用“svnadmin help <subcommand>” 得到子命令的帮助信息。 使用“svnadmin --version”查看程序的版本号和文件系统模块。 可用的子命令: crashtest create deltify dump help (?, h) hotcopy list-dblogs list-unused-dblogs load lslocks lstxns pack recover rmlocks rmtxns setlog setrevprop setuuid upgrade verify [root@svn ~]# svnadmin help create create: 用法: svnadmin create REPOS_PATH 在 REPOS_PATH 创建一个新的空版本库。 有效选项: --bdb-txn-nosync : 在提交事务时禁用fsync [BDB] --bdb-log-keep : 禁用自动删除日志文件 [BDB] --config-dir ARG : 从目录 ARG 读取用户配置文件 --fs-type ARG : 版本库类型: “fsfs”(默认)或“bdb” --pre-1.4-compatible : 使用与1.4之前版本兼容的格式 --pre-1.5-compatible : 使用 Subversion 1.5 之前版本的格式 --pre-1.6-compatible : 使用与 1.6 之前版本兼容的格式
修改配置文件,允许用户zhang读写访问
[root@svn ~]# cd /application/svndata/sadoc/conf/ [root@svn conf]# /bin/cp svnserve.conf svnserve.conf.zhang.$(date +%F) 先备份在修改svnserve.conf # anon-access = read 12行 # auth-access = write 13行 # password-db = passwd 18行 # authz-db = authz 25行 改为 anon-access = none auth-access = write password-db = /application/svnpasswd/passwd authz-db = /application/svnpasswd/authz
------------------------------------------------------------------------------------------
快速修改:
sed -i ‘s/# anon-access = read/anon-access = none/‘ /application/svndata/sadoc/conf/svnserve.conf
sed -i ‘s/# auth-access = write/auth-access = write/‘ /application/svndata/sadoc/conf/svnserve.conf
sed -i ‘s/# password-db = passwd/password-db = /application/svnpasswd/passwd/‘ /application/svndata/sadoc/conf/svnserve.conf
sed -i ‘s/# authz-db = authz/authz-db = /application/svnpasswd/authz/‘ /application/svndata/sadoc/conf/svnserve.conf
查看一下,egrep可以同时过滤两个关键字符,相当于grep –E
[root@svn conf]# egrep "\-access|\db =" svnserve.conf anon-access = none auth-access = write password-db = /application/svnpasswd/passwd authz-db = /application/svnpasswd/authz
实现刚才修改的内容
[root@svn conf]# cp authz passwd /application/svnpasswd/ [root@svn conf]# ll /application/svnpasswd/ 总用量 8 -rw-r--r--. 1 root root 1080 11月 12 01:25 authz -rw-r--r--. 1 root root 309 11月 12 01:25 passwd
改权限
[root@svn conf]# chmod 700 /application/svnpasswd/* [root@svn conf]# ll /application/svnpasswd/ 总用量 8 -rwx------. 1 root root 1080 11月 12 01:25 authz -rwx------. 1 root root 309 11月 12 01:25 passwd
编辑passwd和authz
1) vim /application/svnpasswd/passwd 增加: zhang = 123456 test = 123456 2) vim /application/svnpasswd/authz 增加: #groups zhang_sa = zhang,test1 zhang_wangguan = test #project [sadoc:/] #set project @zhang_sa = rw @zhang_wangguan = r test = r 重启svn [root@svn svnpasswd]# pkill svnserve [root@svn svnpasswd]# killall svnserve svnserve: 没有进程被杀死 [root@svn svnpasswd]# killall svnserve -bash: kill: all: arguments must be process or job IDs -bash: kill: svnserve: arguments must be process or job IDs [root@svn svnpasswd]# svnserve -d -r /application/svndata/ [root@svn svnpasswd]# ps -ef|grep svn root 4225 1 0 18:46 ? 00:00:00 svnserve -d -r /application/svndata/ root 4227 1824 0 18:46 pts/1 00:00:00 grep svn
74 yum install subversion –y
75 rpm -qa subversion
76 mkdir -p /application/{svndata,svnpasswd}
77 svnserve -d -r /application/svndata/
78 ps -ef |grep svn|grep -v grep
79 netstat -lntup|grep svn
80 svnadmin create /application/svndata/sadoc
81 ll /application/svndata/sadoc
82 cd /application/svndata/sadoc/conf/
83 /bin/cp svnserve.conf svnserve.conf.zhang.$(date +%F)
84 ll
85 vi svnserve.conf
86 egrep "\-access|\db =" svnserve.conf
87 ll
88 cp authz passwd /application/svnpasswd/
89 chmod 700 /application/svnpasswd/*
90 vim /application/svnpasswd/passwd
91 vim /application/svnpasswd/authz
92 pkill svnserve
93 kill all svnserve
94 svnserve -d -r /application/svndata/
95 ps -ef|grep svn
96 svnserve -d --listen-port
97 svnserve --listen-port
98 history
3. 客户端安装TortoiseSVN
安装完毕后2008需重启。
(1)建立一个工作目录,如 。
(2)在工作目录中,选择TortoiseSVN右键菜单“SVN检出”,显示检出对话框,输入cnpack版本库url,检出目录设定为工作目录下的cnpack目录。
输入在svn的passwd里配置的用户名密码,复选框:Save authertication的意思是tortoiseSVN在subversion内的缺省目录(%APPDATA%\Subversion\auth)的三个子目录内保存认证信息。
- svn.simple包含了基本认证方式所需要的认证信息(用户名和密码),密文保存
- svn.ssl.server包含了SSL信息
- svn.username里包含了用户名认证的认证信息
如果想清楚服务器的认证缓存,可以通过TortoiseSVN设置对话框的已保存数据页来实现。如果想清除某一个范围的认证信息,则需要打开那些目录,找到包含要清除的信息的文件并删除。
查看服务器上的内容:
上传和更新在文件的上级目录,即(1)中新建的那个工作目录。
3. svn命令行的使用说明
3.1. 导入svn原始目录树
[root@svn ~]# mkdir /data/zhang -p [root@svn ~]# cd /data/zhang/;mkdir trunk branch tags –p #主干,分支,标记# [root@svn zhang]# tree . ├── branch ├── tags └── trunk 3 directories, 0 files
导入svn
网络导入
[root@svn zhang]# svn import /data/zhang svn://192.168.233.150/sadoc/ -m "imp tree" #网络导入 认证领域: <svn://192.168.233.150:3690> 6145f20f-3d6d-40b2-841c-abfdff973c0f “root”的密码: 认证领域: <svn://192.168.233.150:3690> 6145f20f-3d6d-40b2-841c-abfdff973c0f 用户名: zhang “zhang”的密码:
本地导入
svn import /data/zhang/ file:///application/svndata/sadoc/
svn import /data/zhang/ svn://192.168.233.150/sadoc/
注意! 你的密码,对于认证域:
<svn://192.168.233.150:3690> 6145f20f-3d6d-40b2-841c-abfdff973c0f 只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion 可以保存加密后的密码。请参阅文档以获得详细信息。 你可以通过在“/root/.subversion/servers”中设置选项“store-plaintext-passwords”为“yes”或“no”, 来避免再次出现此警告。 ----------------------------------------------------------------------- 保存未加密的密码(yes/no)?yes 增加 /data/zhang/trunk 增加 /data/zhang/branch 增加 /data/zhang/tags 提交后的版本为 2。
3.2. 从svn库提取数据(Linux为客户端)
二次更新时可不加用户名密码
#svn checkout svn://192.168.233.150/sadoc /data/test --username zhang --password 123456
4. svn钩子
钩子脚本的具体写法就是操作系统shell脚本程序的写法,可以根据自己svn所在的操作系统和shell程序进行相应的开发,钩子脚本就是被某些版本库事件触发的程序,例如创建新版本或修改为被版本控制的属性,每个钩子都存储足够的信息来了解发生的事件,操作对象以及触发事件用户的账号,根据钩子的输出或者返回的状态,钩子程序能够以某种方式控制该动作是否继续执行,停止或挂起。默认情况下钩子的子目录中包含各种版本库钩子模板。
查看钩子库
#ls -l /application/svndata/sadoc/hooks
常用应用
- 限制上传文件扩展名及大小
- SVN更新自动周知,途径有MSN,邮件或者短信
- SVN更新触发实时rsync。