使用svn好几年了,还只会update和commit,趁着这次项目需要建立branch分支(分支开发的功能上线待定,原项目正常迭代),系统学习下svn的使用。
一个学习视频地址:https://www.imooc.com/learn/845, 下面是学习笔记,图片均来自视频。
一个全面的svn的文档:https://www.kancloud.cn/i281151/svn/197097,
也可以下载https://download.csdn.net/download/u011109931/11464933
svnadmin create /webroot/svn/test 创建SVN Repository
killall svnserver 停止svn服务
svnserver -d -r /版本库名称/ 启动svn服务
配置svnserve.conf来配置权限,配置passwd来配置用户密码,配置authz来配置用户组
常见命令:
不常见命令:
重要命令:
冲突:更新到的数据与工作副本的修改正好在同一处
避免冲突:经常更新工作副本
3.1 树冲突
发生树冲突的文件都不是二进制文本文件(如后缀为.java,.html,.js等文件)
树冲突无法精确到行并且处理树冲突必须处理整个文件(如图片文件)
3.2冲突处理命令
p(postpone) 推迟处理(推荐使用,对服务端无影响,仅把冲突留在发现冲突的工作副本方)
mc(my side of conflict) 用我的版本
tc(their side of conflict) 用他们的版本
m(merge) 合并
s(show all options)
3.3冲突处理完后,需要执行resolved,通知服务端,冲突已经解决
lock 锁定文件,防止其他成员对文件进行提交(并不能有效解决冲突,反而会降低了团队开发效率)
如果又提交操作,文件就会自动解锁,不想自动解锁写法(svn ci -m "修改日志" --no-unlock 文件名)
unlock 解锁文件
list/ls - 列出当前目录下处于版本控制的所有文件
status/st- 列出工作副本中的文件(夹)的状态,常见状态如下:
log - 查看提交日志(来自svn ci的-m参数)
info-查看工作副本及文件(夹)的详细信息
6.1 svn默认端口号是3690,一台服务器上运行多个版本库,可以通过指定不同的端口号实现,
例如给hello 版本库指定3691端口,命令如下: svnserver -d -r /svnroot/hello --listen-port 3691
6.2 所有版本库放在一个目录下,检出时,检出路径写到相对版本库(我们是这样干的,大家应该都是这样子干的吧)
格式: svn copy/cp 源文件 目标文件
7.1.工作副本复制到工作副本
svn cp index.html copy.html 复制文件同时加入版本库的控制中
svn cp -r 4 index.html copy4.html 复制index的指定版本4到新文件copy4
注意:批量复制无法指定文件名,所以必须放到当前路径之外的路径。
7.2 工作副本复制到版本库
svn cp index.html svn://192.168.0.130/target.html -m "copy a file" 同时完成复制和提交,所以需要加-m参数
注意:不可以跨库复制,从哪个版本库检出,就只能复制到哪个版本库
7.3 版本库复制到工作副本 支持跨库操作
7.4 版本库复制到版本库(一般是主干版本与分支版本)
也就是使用copy命令从版本库复制到版本库。
一般开发中,版本库会有3个文件夹:trunk主干版本,branches包含多个分支版本,tag上线版本的备份。
当需要建立分支版本时,由trunk目录copy到branches目录下面,开发完毕确定上线后从branches目录merge到trunk目录,上线成功后,将代码merge到tag目录,线上代码的一个备份。branches目录无用后可以删除掉。
merge命令:(在使用merge功能时,一定要在合并目的地选择merge功能,而不是在数据源处选择merge。)
如果需要把branches里面的修改合并到trunk中,选中trunk文件夹进行merge,填写要合并内容来源为branches。反之亦然。
1.分支合并回主干(分支在修订版本250创建)
$ svn merge -r 250:HEAD http://svn.red-bean.com/repos/branches/my-branch
2.主干的修改合并到分支(分支在修订版本23)
$ svn merge -r 23:30 file:///tmp/repos/trunk/vendors
下面这张图百度上找的,和上面不同的是从tag版本库发布上线,而不是trunk版本库。
我的项目结构:
9.1 hooks钩子应用
钩子:当执行某些特定操作时触发执行预定设定好的任务。类似触发器。
svn可以执行的钩子在hooks文件夹下面
一次提交操作包括:数据传输--->版本库写入
钩子文件的前缀:start数据传输之前,pre写入版本库之前,post写入版本库之前。
如何使用hooks:
1.复制对应的钩子文件(shell脚本文件),并去掉.tmpl后缀
2.进入文件编辑,输入指令
3.给文件增加可执行权限
4.重启svn服务后生效
9.2版本库精简与丢弃
9.2.1 备份版本号6到16的信息
svnadmin dump /svnroot/imooc/(这里是版本库文件系统的路径,不是url) -r 6:16 > ~/imooc.repo
-r 指定版本号范围
9.2.2 创建新的版本库
svnadmin create /svnroot/newimooc
9.2.3将刚才备份出来的版本库信息加载进来
svnadmin load /svnroot/newimooc/ < ~/imooc.repo
9.2.4 newimooc版本库,就是从原来imooc版本库精简后,得到的版本库,新的版本号从1开始。
9.2.5 imooc版本库的配置文件,复制到newimooc版本库下,旧的版本库imooc可以删除掉了
9.2.6 重启svn服务,工作副本,需要重新检出,原来检出的不可用了,因为版本库精简后版本号对不上。
9.3版本库迁移与switch重定向
上面的版本库精简与丢弃,如果版本号是从1到最新,就是整个版本库迁移了。
下面的方法暴力,但是可行。
版本库迁移后,客户端的工作副本地址就需要更新为新的,这个操作也就叫重定向,需要用到 switch/sw 重定向命令:
svn sw --relocate 原来的url 新的url
10. svnc常见的坑及课程总结
1.忘记配置svnserve.conf,这个文件指定了用户名和密码的文件的位置和权限配置的文件位置
虽然svn服务正常,但是找不到上面说的文件位置,导致无法登陆,无法检出,用户名密码错误等报错
2.运行版本库的路径问题
运行时写了版本库名称,检出时就不写了,运行没写版本库名称,检出时就得写。(为啥呢?没弄懂)
3.svnadmin dump/load 管道符号问题: 备份是大于号> , 加载是小于号<; 如果加载时弄错了,写成大于号>,备份的数据就被覆盖了。