svn介绍
常见版本控制软件
svn常用的运行模式
svn常用的访问模式
svn数据格式
svn服务器搭建部署
windows系统svn客户端使用
linux系统svn客户端使用
Svn钩子脚本简介
Svn备份还原模拟演练
本文参考了网上资料
svn 服务端搭建部署
svn介绍
Subversion(SVN)是一个开源的,跨平台的版本控制系统,由CollabNet公司成立于2000年;Subversion作为新一代的版本管理系统,以其目录版本化、原子提交、版本化的元数据、更加有效的分支和标签等特性,至今已被众多的互联网企业使用来管理网站、论坛的代码文件;Subversion最独特的地方,便是可以通过Apache的扩展模块与Apache的HTTP服务相结合,实现更安全的特性与管理,其次用户还可以通过HTTP协议去访问版本库,还可以通过SSL协议传输加密,保证数据的安全性;Subversion是Apache软件基金会的发展的一个项目,并且也是一个丰富的开发人员和用户社区的一部分。
常见的版本控制软件
1,CVS,逐渐被SVN取代,是CVX重写版和改写版
2,SVN,Subversion
3,Git,Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件
svn的服务器常见有3种运行访问方式
1
2
3
|
1、独立服务器(例如:svn:
//IP/sadoc
);
2、借助apache(例如:http:
//IP/sadoc
);
3、本地直接访问(例如:
file
:
//IP/sadoc
)
|
客户端访问方式
Subversion可以通过多种方式访问--本地磁盘访问,或各种各样不同的网络协议,但一个版本库的地址永远都是一个URL,URL方案反映了访问方法
1
2
3
4
5
|
file
:
//
直接版本访问(本地磁盘或者网络磁盘)
http:
//
通过WebDAV协议访问支持Subversion的Apache服务器
https:
//
与http:
//
相似,但是用的SSL加密
svn:
//
通过未认证的TCP
/IP
自定义协议访问svnserver服务器
svn+
ssh
:
//
通过认证并加密的TCP
/IP
自定义协议访问svnserver服务器
|
SVN数据格式
Subversion存储版本数据方式2种:BDB(一种事务安全型表类型)和FSFS(一种不需要数据库的存储系统)。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点;那么在创建Subversion版本控制仓库的时候,可以指定存储版本数据为FSFS方式;
集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突,提交。所有的版本信息都放在服务器上。如果脱离了服务器,开发者基本上可以说是无法工作的。下面举例说
明:开始新一天的工作
1、从服务器下载项目组最新代码
2、进入自己的分支,进行工作,每隔一小时向服务器上自己的分支持提交一次代码(很多人都有这个习惯。因为有时候自己对自己代码改来改去,最后又想还原到前一个小时的版本,或者看看前一个小时自己修改了哪些代码,就需要这样做了)。
3、下班时间快到了,把自己的分支合并到服务器的主分支上,一天的工作完成,并反映给服务器
这就是经典的svn工作流程,从流程上看,有缺点,也有优点
缺点:
1、服务器压太大,svn数据库容量暴增
2、如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等
3、不适合开源开发(开发人数非常非常多,但是Google app engine就是用SVN的)。但一般集中式管理的有非常明确权限管理机制(例如分支访问限制),可以实现分层管理,从而很好解决开发人数众多问题
优点:
1、管理方便,逻辑明确,符合一般人思维习惯
2、易于管理,集中式服务器更能保证安全性
3、代码一致性非常高
4、适合开发人数不多的项目开发
5、大部分软件配置的大学教材都是使用svn和vss
1,yum安装subversion
1
|
[root@localhost ~]
# yum -y install subversion
|
2,检测是否安装成功
1
2
|
[root@localhost ~]
# rpm -qa subversion
subversion-1.6.11-15.el6_7.x86_64
|
3,创建svn版本根目录已经密码权限目录
1
2
3
4
5
6
7
8
|
[root@localhost ~]
# mkdir -pv /web/svndata /web/svnpasswd
mkdir
: 已创建目录
"/web"
mkdir
: 已创建目录
"/web/svndata"
mkdir
: 已创建目录
"/web/svnpasswd"
[root@localhost ~]
# ll /web/
总用量 8
drwxr-xr-x. 2 root root 4096 2月 23 22:16 svndata
drwxr-xr-x. 2 root root 4096 2月 23 22:16 svnpasswd
|
4,启动服务,并检测服务和端口是否开启
1
2
3
4
5
|
[root@localhost ~]
# svnserve -d -r /web/svndata
[root@localhost ~]
# ps -ef | grep svn | grep -v grep
root 1745 1 0 22:18 ? 00:00:00 svnserve -d -r
/web/svndata
[root@localhost ~]
# netstat -lntup | grep 3690
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1745
/svnserve
|
5,创建一个新的subversion项目www.baidu.com,项目可以创建很多个
1
2
3
|
[root@localhost ~]
# svnadmin create /web/svndata/www.baidu.com
[root@localhost ~]
# ls -ld /web/svndata/www.baidu.com/
drwxr-xr-x. 6 root root 4096 2月 23 22:20
/web/svndata/www
.baidu.com/
|
6,关于帮助,可以查看帮助
1
2
3
4
5
6
7
8
9
10
11
|
[root@localhost ~]
# 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 之前版本兼容的格式
|
7,修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
[root@localhost ~]
# cd /web/svndata/www.baidu.com/
[root@localhost www.baidu.com]
# ls
conf db
format
hooks locks README.txt
**************************************************************************
dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据,刚开始新建时此目录没有
db目录:就是所有版本控制的数据存放文件
hooks目录:放置hook脚本文件的目录
locks目录:用来放置subversion常见锁定数据的目录,用来追踪存取文件库的客户端
format
文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号
conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等),也是我们要关注的配置文件
[root@localhost www.baidu.com]
# cd conf/
[root@localhost conf]
# ls
authz
passwd
svnserve.conf
**************************************************************************
authz
#认证权限相关
passwd
#用户名和密码
svnserve.conf
#服务器配置文件
[root@localhost conf]
# cp svnserve.conf svnserve.conf.2016-3-3bak
[root@localhost conf]
# vi svnserve.conf
[root@localhost conf]
# egrep "\-access|-db = " svnserve.conf
anon-access =
read
#原先注释掉了,匿名用户可以读,使用none的话就是匿名用户不可以访问
auth-access = write
#这几行都要取消注释,认证用户可以写,可以是read,write,none
password-db =
/app/svnpasswd/passwd
#密码库文件,默认使用的是同一目录下的passwd文件作为用户密码库
authz-db =
/app/svnpasswd/authz
#认证权限文件
realm = www.baidu.com
#登陆提示信息
注意:此配置文件的所有内容必须顶格,否则会报错
|
8,定义用户名密码,权限配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@localhost conf]
# cp authz passwd /web/svnpasswd/
[root@localhost conf]
# cd /web/svnpasswd/
[root@localhost svnpasswd]
# ls
authz
passwd
[root@localhost svnpasswd]
# vi passwd
[
users
]
# harry = harryssecret
# sally = sallyssecret
user1 = 123456
user2 = 123456
user3 = 123456
**************************************************************************
#末尾添加上面三行
#对于部分版本,前面的[users]是有#号的,如果有#号,一定要取消,否则只能使用匿名用户登录,客户端登录不会
出现登录窗口或密码提示,除非在配置文件将anon设置为none,否则将返回一个错误
#这里的密码都是明文,没有加密
|
8.1,配置权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
[root@localhost svnpasswd]
# vi authz
[
groups
]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
# [/foo/bar]
# harry = rw
# &joe = r
# * =
# [repository:/baz/fuz]
# @harry_and_sally = rw
# * = r
admin = user1,user2
#定义组,在[groups]下面添加 #用户组格式 用户组名 = 用户1,用户2
#一个组可以包含多个用户,英文逗号间隔,用户名必须是在passwd中存在的
[www.baidu.com:/]
#/表示我当前所在版本库目录
@admin = rw
#@admin表示这个组的权限,就是上面定义的组的成员
user3 = r
#用户
* =
#除了上面的有赋予权限成员之外,其他的成员都没有权限
**************************************************************************
authz配置
用户组格式,其中1个用户组可以包含1个或多个用户,用户间用,隔开
[
groups
]
=,
[<项目库>:/项目/目录]
@<用户组名> = <权限>
<用户名> = <权限>
[/]表示根目录 及以下,根目录是svnserve启动时指定的,
我们指定为
/app/svndata
,[/]就是表示全部版库设置权限
[repos:/]表示版本库repos设置权限
[repos:
/webtest
]表示版本库repos中的webtest项目设置权限
[repos:
/webtest/zhanghe
]表示版本库对repos中的webtest项目的zhanghe目录设置权限
权限主体可以是用户组,用户或*,用户组在前面加@,*表示全部用户
权限可以是w,r,wr和空,空表示没有任何权限
authz中每个参数都要顶格写,开头不能空格
对于组,要以@开头,用户不需要@开头
|
9,重新启动svn服务
1
2
3
4
5
6
|
[root@localhost svnpasswd]
# pkill svnserve
[root@localhost svnpasswd]
# ps -ef | grep svn
root 1881 1679 0 23:30 pts
/0
00:00:00
grep
svn
[root@localhost svnpasswd]
# svnserve -d -r /web/svndata/
[root@localhost svnpasswd]
# netstat -tlunp | grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 1883
/svnserve
|
windows系统svn客户端使用
Linux系统运维交流群:476794643
1,下载svn windows 客户端
2,安装windows svn客户端
3,新建文件夹svn 右击svn checkout设置设置取出数据
4,设置svn地址
5,输入账号密码
6,见到这个页面就代表取出数据成功了
7,windows svn客户端提交数据
8,提交数据成功
9,右击 tortoisesvn 选中 repo-browser,随时查看服务器上面的内容
10,看到服务器上面的内容了
linux系统 svn客户端使用
Linux系统运维交流群:476794643
svn Linux客户端使用帮助
1,安装软件
1
|
[root@localhost ~]
# yum -y install subversion
|
2,本地取出svn数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@localhost ~]
# mkdir svn
[root@localhost ~]
# svn co svn://192.168.42.128/www.baidu.com /root/svn/ --username=user1 --password=123456
-----------------------------------------------------------------------
注意! 你的密码,对于认证域:
<svn:
//192
.168.42.128:3690> Welcome SVN server
只能明文保存在磁盘上! 如果可能的话,请考虑配置你的系统,让 Subversion
可以保存加密后的密码。请参阅文档以获得详细信息。
你可以通过在“
/root/
.subversion
/servers
”中设置选项“store-plaintext-passwords”为“
yes
”或“no”,
来避免再次出现此警告。
-----------------------------------------------------------------------
保存未加密的密码(
yes
/no
)?
yes
A
/root/svn/index
.php.txt
取出版本 1。
[root@localhost ~]
# svn co svn://192.168.42.128/www.baidu.com /root/svn/ --username=user1 --password=123456
A
/root/svn/zabbix
.txt
取出版本 2。
[root@localhost ~]
# ls svn/
index.php.txt zabbix.txt
|
###################################
2.1,解决 UTF-8 中文取出失败
1
2
|
[root@localhost ~]
# export LC_CTYPE="en_US.UTF-8"
[root@localhost ~]
# export LC_ALL=
|
3,Linux客户端查看svn文件列表
1
2
3
4
|
[root@localhost ~]
# svn ls svn://192.168.42.128/www.baidu.com --username=user1 --password=123456
index.php.txt
zabbix.txt
新建文本文档.txt
|
4,Linux客户端查看svn文件内容
1
2
3
|
[root@localhost ~]
# svn cat svn://192.168.42.128/www.baidu.com/zabbix.txt
111111111111111111111111
222222222222222222222222
|
5,Linux客户端提交数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
[root@localhost svn]
# touch {a..e}#一定要本地创建好
[root@localhost svn]
# ls
a b c d e index.php.txt zabbix.txt 新建文本文档.txt
[root@localhost svn]
# svn add a b c d e
A a
A b
A c
A d
A e
[root@localhost svn]
# svn ci -m "1"
增加 a
增加 b
增加 c
增加 d
增加 e
传输文件数据.....
提交后的版本为 5。
|
6,文件夹创建提交
1
2
3
4
5
6
|
[root@localhost svn]
# mkdir zhanghe
[root@localhost svn]
# svn add zhanghe
A zhanghe
[root@localhost svn]
# svn ci -m "2"
增加 zhanghe
提交后的版本为 6。
|
7,Linux客户端数据导入
1
2
3
4
5
6
7
|
[root@localhost ~]
# mkdir svn1
[root@localhost ~]
# mkdir -p svn1/trunk svn1/branch svn1/tag
[root@localhost ~]
# svn import svn1/ svn://192.168.42.128/www.baidu.com -m "4"
增加 svn1
/trunk
增加 svn1
/tag
增加 svn1
/branch
提交后的版本为 7。
|
8,svn 把主干拷贝成分之
1
2
|
[root@localhost ~]
# svn copy svn://192.168.42.128/www.baidu.com/trunk svn://192.168.42.128/www.baidu.com/branch/branch_cms_160303 -m "5" --username=user1 --password=123456
提交后的版本为 8。
|
Svn钩子脚本简介
Linux系统运维交流群:476794643
钩子脚本的具体写法就是操作系统shell脚本程序写法,请根据自己SVN所在的操作系统和shell程序进行相应的开发。
钩子脚本就是被某些版本库事件触发的程序,例如创建新版本或修改未被版本控制的属性。每个钩子都能掌管足够的信息来了解发生了什么事件,操作对象是什么以及触发事件用户的账号。根据钩子的输出或者返回状态,钩子程序能够以某种方式控制该动作继续执行,停止或者挂起。
1
2
3
4
5
6
|
svn的hooks模版功能介绍
start-commit提交前触发事务
pre-commit提交完成前触发事务
post-commit提交完成时触发事务
pre-revprop-change版本属性修改前触发事务
post-revprop-change版本属性修改后触发事务
|
1
|
post-commit
|
在提交完成,成功创建版本之后执行该钩子,提交已经完成,不可更改,因此脚本返回值被忽略
1
|
post-lock
|
对文件进行加锁操作之后执行该脚本
1
|
post-revprop-change
|
在修改revision属性之后,执行该脚本。因为修改稿已经完成,不可更改,因此本脚本的返回值被饭忽略
(不过实际上的实现似乎是该脚本的正确执行与否影响属性修改)
1
|
post-unlock
|
对文件进行解锁操作之后执行该脚本
1
|
pre-commit
|
在Subversion transaction完毕之后,在提交之前,执行该脚本
1
|
pre-revprop-change
|
在修改revision属性之前,执行该脚本
1
|
start-commit
|
对客户端还没有向服务器提交数据之前,即还没有建立Subversion transaction(缩写txn)之前,执行该脚本
脚本post-commit 演示
脚本用处:当svn更新时候,自动同步到tmp下面去,适合网站使用
1
2
3
4
5
6
7
8
9
10
11
12
13
|
REPOS=
"$1"
REV=
"$2"
export
LC_CTYPE=
"en_US.UTF-8"
export
LC_ALL
LOGPATH=
"/web/log"
[ ! -d ${LOGPATH} ] &&
mkdir
${LOGPATH} -p
#update content from svn
SVN=
/usr/bin/svn
$SVN update --username user1 --password 123456
/data/www
if
[ $? -
eq
0 ]
then
/usr/bin/rsync
-az --delete
/data/www
/tmp
fi
|
脚本pre-commit 演示
脚本用处:限制上传文件大小,文件后缀
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
REPOS=
"$1"
TXN=
|