1. 需求
1 同事直接访问SVN服务器根目录。
2 根目录下按照各个部门创建不同的文件夹
3 只能看到对应部门的文件夹。其他部门的文件不可见
2. 搭建SVN服务器

2.1 yum安装。

yum -y install svn
2.2 创建项目的根目录
mkdir /var/svn
svnadmin create /var/svn/test

对应目录下会生成如下目录

svn]# ls #外表看和普通目录其实是一样的
test
test]# ls #如下是自动生成的目录
conf db format hooks locks README.txt

配置文件

2.3 修改svnserver

vi svnserve.conf
anon-access = none #为了安全起见,匿名用户不给权限
auth-access = write #认证用户可写
password-db = passwd #使用passwd文件做用户文件
authz-db = authz #使用authz作为鉴权文件
realm = /var/svn/test #根目录位置。 # 其实感觉这个参数 作用不大。

2.4 创建用户

vi passwd
kaifa = 123qwe
ceshi = 123qwe
yunwei = 123qwe
guanli = 123qwe
# 用户名 = 密码

2.5 授权

vi authz
[groups]
# harry_and_sally = harry,sally
# harry_sally_and_joe = harry,sally,&joe
kaifa = kaifa
yunwei = yunwei
ceshi = ceshi
guanli = guanli
#组名 = 成员。 用逗号隔开
## 文件最下
[/]
@kaifa = rw #@组名 给组授权
@ceshi = rw
yunwei = rw #单用户授权, 每行一个
guanli = rw

启动服务

svnserve -d -r /var/svn/test/
ps -ef|grep svn
root 6427 1 0 23:53 ? 00:00:00 svnserve -d -r /var/svn/test/
root 6429 5240 0 23:53 pts/0 00:00:00 grep --color=auto svn
3. 安装windows客户端

网盘下载地址

链接:https://pan.baidu.com/s/1DdUwkQmohPg73kh9I2VNog 
提取码:qwer
--来自百度网盘超级会员V4的分享
LanguagePack_1.13.1.28686-x64-zh_CN.msi #汉化包
TortoiseSVN-1.13.1.28686-x64-svn-1.13.0 #客户端

​官网下载地址​

SVN企业实战策略_svn

往下拖

SVN企业实战策略_svn_02

按照步骤就略过了。 按照提示一步一步确定即可。

两个都安装完成后

右键会多出如下两个按钮

SVN企业实战策略_svn_03

点击设置/setting 选择中文即可。

SVN企业实战策略_svn_04

4. svn检出

右键 svn检出

SVN企业实战策略_svn_05

版本库: 填写svn://ip 即可
检出目录也可以自定义

SVN企业实战策略_svn_06

svn 默认使用的是 3690端口。
左下角的保存认证记得别勾选, 不然测试起来很麻烦。
输入任意一个用户名和密码登录即可

此时桌面上会生成一个ipt同名的文件夹,里面内容如下

SVN企业实战策略_svn_07

创建如下几个目录

SVN企业实战策略_svn_08

中文文件夹需要linux服务端 支持中文, 若安装系统时没有勾选中文则参考

​字符集更改​

创建完成后,右键 svn提交

点击全选。点击确定,

SVN企业实战策略_svn_09

弹出的框框再次输入用户密码。若第一步选择了记住,则本次就不用输入了

这次也还是不记住

SVN企业实战策略_svn_10

即提交完成。

SVN企业实战策略_svn_11

5. 服务端权限
vi authz 
[/]
* = r #根目录给读的权限。不然下面的目录别人无法看见。但不能给写,防止成员任意在根目录下创建目录
[/运维]
yunwei = rw #相关组和用户即给读写的权限
* = #* = 代表其他用户没有任何权限。这个必须存在,不然其他用户可以看到属于该部门的内容
[/开发]
@kaifa = rw
* =
[/测试]
@ceshi = rw
* =
[/管理]
guanli = rw
* =

权限修改完后,即时生效,不需要重启服务

6. 重新测试

删除刚刚检出的目录

重新检出。 使用开发账户登录。 仍然选择不记住

SVN企业实战策略_svn_12

仅可查看开发对应的目录

SVN企业实战策略_svn_13

尝试在根目录下创建一个文件夹,并提交

SVN企业实战策略_svn_14

使用开发账户登录。 仍然选择不记住

会提示 提交失败。权限拒绝

SVN企业实战策略_svn_15

此时我们删除根目录下的该文件。并进入开发目录创建文件夹

SVN企业实战策略_svn_16

再次提交,即可成功

SVN企业实战策略_svn_17

此时领导的需求即已经完成。

7. 小提示
  1. svn更新,是用来同步其他同事更新的内容,即相当于拉取了当前服务器内最新状态的库
  2. 当你从windows端拉取一个文件到svn目录时,windows端的该文件会消失,所以请复制进去。
  3. svn修改配置后无需重启,即可生效
8. svn管理多个版本库

上面写的内容是在一个版本库下创建多个子目录来实现需求。同时也可以同时使用多个版本库的功能。

修改配置

vi svnserve.conf
realm = /var/svn #将根目录指到 版本库的上层目录

创建别的版本库

[root@k8s-vip svn]# pwd
/var/svn
[root@k8s-vip svn]# svnadmin create 运维
[root@k8s-vip svn]# svnadmin create 开发
[root@k8s-vip svn]# svnadmin create 测试
[root@k8s-vip svn]# svnadmin create 管理
[root@k8s-vip svn]# ls
test 测试 管理 开发 运维

修改几个新版本库的svnserver的如下内容

anon-access = none
auth-access = write
password-db = ../../passwd
authz-db = ../../authz #指定为/var/svn/下的两个配置。

将test目录下的passwd authz拷贝到 /var/svn/目录下。并进行如下修改

vi authz
[/] #根目录不给任何权限了
* =
[运维:/] #运维即版本库名 :/ 为啥这么写 我也不知道 。反正这么就能实现
yunwei = rw
* =
[开发:/]
@kaifa = rw
* =
[测试:/]
@ceshi = rw
* =
[管理:/]
guanli = rw
* =

重启服务

这个因为修改了跟目录。而我们启动时指的是另一个目录,所以得重启
ps -ef|grep svn
kill pid
svnserve -d -r /var/svn/

客户端检出时,也发生了点变化。

删除原来的,重新检出即可。

9. svn结合ldap

​参考​

10. 备份

官方有三种备份方式

svnadmin dump 
svnadmin hotcopy
svnsync

10.1 svnadmin hotcopy

svnadmin hotcopy原设计目的估计不是用来备份的,只能进行全量拷贝,不能进行增量备份; 
优点是:备份过程较快,灾难恢复也很快;如果备份机上已经搭建了svn服务,甚至不需要恢复,只需要进行简单配置即可切换到备份库上工作。
缺点是:比较耗费硬盘,需要有较大的硬盘支持

以第一种方法为实验背景

运维库为标准

创建了一个test1。 并提交

SVN企业实战策略_svn_18


创建一个备份。

svn]# svnadmin hotcopy test test.bak
svn]# ls
test test.bak

回到windows,将test1目录删掉。并提交

SVN企业实战策略_svn_19

进行恢复

svn]# rm -rf test
svn]# svnadmin hotcopy test.bak test

回到windows。进行svn更新

test1 回来了

SVN企业实战策略_svn_20

创建脚本。配合计划任务实现自动备份

我这边根据领导的安排,是不在本地保存,统一备份到备份服务器。

vi svn-bak.sh
svnadmin hotcopy /var/svn/test /var/svn/test.bak
cd /var/svn/
tarbao=test.bak.`date +%Y%m%d`tar.gz
tar zcf $tarbao test.bak
rsync $tarbao root@192.168.50.30:/opt/svn/
rm -rf test.bak $tarbao

可以搭配邮件服务器。发送成功后,邮件通知结果。 公司内部由于部分原因,就不采用该方式了。固定上班以后手动看下。(反正就算发了邮件 也得看看备份结果)

结合计划任务。实现每晚3点进行备份

crontab -e
* 3 */1 * * bash /var/svn/svn-bak.sh > /dev/null 2>&1

这是我用的法子。备份时无需额外备份配置文件。

恢复需要重新检出

10.2 svnadmin dump

svnadmin dump是官方推荐的备份方式,优点是比较灵活,可以全量备份也可以增量备份,并提供了版本恢复机制。
缺点是:如果版本比较大,如版本数增长到数万、数十万,那么dump的过程将非常慢;备份耗时,恢复更耗时;不利于快速进行灾难恢复。
且 这种方法不会备份conf文件
个人建议在版本数比较小的情况下使用这种备份方式。

同样的方法进行测试。

当前是有test1文件夹的。

查看当前的版本号

svn]# svnlook youngest test  #test 为版本库名称
2

创建一个完整备份

svn]# svnadmin dump test > test.bak      #前为版本库,后为备份
* 已转存版本 0。
* 已转存版本 1。
* 已转存版本 2。

windows端删除test1.并提交

然后进行恢复

svn]# svnlook youngest test 此时为版本3
3
将conf文件进行备份
cp -r test/conf .
恢复时,需要先删除原本的版本库,并创建一个新的。 不然恢复无用。
rm -rf test
svnadmin create test
svnadmin load test < test.bak
<<< 开始新的事务,基于原始版本 1
* 正在增加路径: 开发 ...完成。
* 正在增加路径: 测试 ...完成。
* 正在增加路径: 管理 ...完成。
* 正在增加路径: 运维 ...完成。

------- 提交后版本 1 >>>

<<< 开始新的事务,基于原始版本 2
* 正在增加路径: 运维/test1 ...完成。

------- 提交后版本 2 >>>
然后删除 新版本库中的conf。目录。并把我们备份的conf复制进去
rm -rf test/conf/
cp -r conf/ test/

10.3 备份总结

他的增量备份,玩儿不明白。所以我选择用了svnadmin hotcopy.

而且svnadmin dump 不备份conf文件。恢复时不太方便。且每次更改权限还需要额外备份conf,所以不用他。

11. 选择

对于该需求来说,两种方法则各有利弊。

单项目多子目录:

  1. 优点:方便管理,且成员使用时,只需要连接svn服务器即可,无需指定目录
  2. 缺点:若某一个子目录的用户误删重要文件,且他人无备份时,若想恢复,则需全部子目录都恢复上个版本。 但 可以通过hotcopy的文件,额外开个SVN出来供恢复使用,然后重新提交至主线

多个项目:

  1. 优点:多个项目目录各自互相不影响,备份恢复比较灵活
  2. 缺点:成员使用时,需要在ip地址后额外指定项目名称,