SVN的使用,也就是一些常见svn命令

    使用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 

1.svn服务端命令:

  • mkdir /webroot/svn       创建SVN服务器端版本库根目录
  • svnadmin create /webroot/svn/test      创建SVN Repository

  • killall svnserver     停止svn服务

  • svnserver -d -r /版本库名称/        启动svn服务

  • 配置svnserve.conf来配置权限,配置passwd来配置用户密码,配置authz来配置用户组

2.svn客户端命令:

常见命令:

  • add 添加到版本控制
  • commit/ci 提交修改到服务器(每次提交都会生成一个新的版本号)
  • update/up 更新工作副本(默认情况下,每个文件只会从服务端更新一次最新版本,除了文件缺失会重复从服务器端更新下来)
  • delete/del、remove/rm  从版本库中删除文件
  • check out/co 检出会生成.svn文件夹,里面记录导出的工作副本的版本变化信息,可以进行版本控制。
  • export 导出文件内容,无.svn文件夹,所以也就没有版本控制相关信息。(注意check out 和export的区别)

不常见命令:

  • diff / di  版本差异比较(工作副本与版本库的比较,指定版本库间的比较)
  • mkdir 创建目录(文件夹)并添加到版本控制中
  • cat 不检出工作副本直接查看指定文件(类似在线查看指定文件内容)

重要命令:

  • revert 回退(开发必备后悔药),默认不会递归文件夹中的子目录,递归写法:svn revert --recursive *

3.冲突(重要内容☆☆☆)

冲突:更新到的数据与工作副本的修改正好在同一处

避免冲突:经常更新工作副本

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,通知服务端,冲突已经解决

4.锁定与解锁

lock 锁定文件,防止其他成员对文件进行提交(并不能有效解决冲突,反而会降低了团队开发效率)

如果又提交操作,文件就会自动解锁,不想自动解锁写法(svn ci -m "修改日志" --no-unlock 文件名)

unlock 解锁文件

5.SVN进阶应用

list/ls - 列出当前目录下处于版本控制的所有文件 

status/st- 列出工作副本中的文件(夹)的状态,常见状态如下:

                

log - 查看提交日志(来自svn ci的-m参数)

info-查看工作副本及文件(夹)的详细信息

6.多版本库的解决方案

6.1 svn默认端口号是3690,一台服务器上运行多个版本库,可以通过指定不同的端口号实现,

例如给hello 版本库指定3691端口,命令如下:  svnserver -d -r /svnroot/hello --listen-port 3691

6.2 所有版本库放在一个目录下,检出时,检出路径写到相对版本库(我们是这样干的,大家应该都是这样子干的吧)

7. 一个重要的命令copy/cp 

格式: 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 版本库复制到版本库(一般是主干版本与分支版本)

8.主干版本与分支版本

也就是使用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.svn高级应用

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 管道符号问题:  备份是大于号> , 加载是小于号<; 如果加载时弄错了,写成大于号>,备份的数据就被覆盖了。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值