svn/subversion 集中式版本控制
1.安装
linux
yum -y install subversion #内置客户端与服务端
2.命令
(补充术语:版本库=线上版本库 工作副本=已加入版本控制的本地库)
服务器端命令:
svnadmin create /path/repos 创建版本库,可以追加相对路径或者绝对路径
--fs-type 后可追加存储格式选项
fsfs 常用格式
dbd
rm -rvf /path/repos 删除版本库
svnserve -d -r /svnroot/imooc 运行次版本库
--listen-port 指定端口
版本库配置及权限管理:
/path/repos/conf/ 配置文件位置
passwd 配置用户名和密码
user1 = passwd1
user2 = passwd2
svnserve.conf 配置默认权限、权限配置文件及密码配置文件位置
anon-access = read/write/none 未经认证用户默认权限
auth-access = read/write/none 已认证用户默认权限
password-db = passwd passwd文件路径
authz-db = authz auth文件路径
auth 配置用户组以及用户组权限
[aliases] 别名 一般不用
[groups] 用户组
pm = user1
dev = user1,user2
[/] 表示版本库的根目录,多个版本库的auth可以同时指向一个
@pm = rw 如果是组前缀需要加@
@dev = r
user3 = rw
[imooc:/] 表示名为imooc的版本库跟目录
@pm = rw
user1 = r
user2 = 表示无权限
* = r *表示所有用户
客户端命令
Linux:
mkdir svntest && cd svntest 创建一个存放目录
svn
co/checkout svn://192.168.0.1 检出并更新版本库,目录包含.svn隐藏文件夹用来记录工作副本的一切变化,在版本控制之下
--username NAME
--password PASSWD
-r 2 检出版本2
后面可以不追加用户密码,但是需要输入一下所使用的的系统用户密码
export 导出,用法与checkout相同,导出目录下无.svn隐藏文件夹,不在版本控制之下
add 添加到版本控制
--non-recursive 不递归增加
* 表示所以文件
force 强制执行
ci/commit 提交修改到服务端(创建一个新版本号)
-m "" 提交备注,必须要加的选项
--no-unlock 提交文件后不自动解锁
up/update 全目录更新到最新版本
-r 1 标识更新到版本1
* 强制所有副本更新到最新版本
del/delete/rm/remove 从版本库中删除文件或目录
-m "" 备注,可不加
然后需要执行提交操作,相当于版本变化
diff/di 版本库与本地库差异比较
-r 2 表示本地库与版本号为2的版本库进行差异比较
-r 1:3 表示版本库版本为1跟版本为3的内容进行差异比较
- 前缀表示版本库中最新版本内容
+ 表示本地库内容
如果有差异会把版本库与本地库都表示出来
mkdir 创建目录并直接加入到版本控制中
cat 不检测工作副本的情况下直接查看指定文件
例:svn cat svn://192.168.0.130/index.html
revert FILENAME|* 还原本地工作副本最后一次更新的状态(与reset回滚不同,revert会提取你指定的版本并再次提交)
--recursive 递归还原
lock 锁定文件,防止其他人员对文件进行提交,当自己进行提交后文件会自动解锁
unlock
list/ls 列出当前目录下处于版本控制的所有文件
--recursive 递归
-v 详情,依次显示最后一次提交的版本、用户、大小、时间
status 列出工作副本中的文件(夹)的最后一次被改动后的状态
标记代表的状态:
? 无版本控制
D 已被标记从版本库中删除
M 已被编辑过
A 已被标记增加到版本控制中
R 文件被替换
C 文件存在冲突
! 文件缺失
log 查看提交日志(来自svn ci的-m参数)
info 工作副本及文件(夹)的详细信息
--xml 以xml格式输出
copy/cp 复制文件或目录并加入到版本库中,可复制多个
-r 指定版本
示例:
svn cp -r 4 index.html copy.html 指定版本复制
svn cp index.html copy.html ./temp 多个复制
svn cp index.html svn://192.168.10.1/imooc/target.html -m " " 跳过版本库直接加到线上版本库中,不能跨库执行
svn cp svn://192.168.10.1/imooc/target.html index.html 从线上版本库复制到工作副本,支持跨库操作
svn cp svn://192.168.10.1/imooc/ svn://192.168.10.1/imooc//trunk -m " " 脱离工作副本,不支持跨库
swich/sw 版本库重径向
--relocate 重径向
示例:
svn sw --relocate svn://192.168.0.1/old svn://192.168.0.1/new
windos
TortoiseSVN : http://tortoisesvn.net/downloads.html 客户端下载地址
VisualSVN : http://www.visualsvn.com/server/download 服务端下载地址
安装小乌龟工具
创建文件夹,并鼠标右击选择 svn检出
输入svn的URL
代码冲突
代码冲突:多个程序员同时更改相同位置代码,并且更改前并未及时更新本地代码导致版本不同,服务器不知道需要保留哪个版本的修改而产生冲突
例:提交代码时提示‘is out fo data’ 一般为代码冲突
代码冲突更新代码时会提示 ‘conflict discovered’
此时会有提示选项:
p 延迟提交,延迟后会把冲突的内容发送到本地,而不会影响线上版本
延迟后可以直接编辑源文件进行修改
也可以#svn resolve FILENME 命令进行解决冲突
df 差异对比
e 编辑文件
mc 保存自己代码
tc 保存他人代码
处理完冲突后需要告诉服务端冲突已处理才能进行接下来的提交代码
#svn resolved FILENAME
树冲突:非二进制文件冲突,无法精准到行,而且处理树冲突必须处理整个文件
多版本库解决方案:
svn默认端口号:3690
多端口号:
运行命令:
svnserver -d -r /svnroot/hello --listen-port 3691
svnserver -d -r /svnroot/word --listen-port 3692
检出命令:
svn co svn://192.168.10.1:3691 SVNNAME1
svn co svn://192.168.10.1:3691 SVNNAME2
多路径方式
前提条件:多个版本库必须在同一目录下
运行命令:
svnserver -d -r /svnroot/
检出命令:
svn co svn://192.168.10.1/SVNNAME1
svn co svn://192.168.10.1/SVNNAME2
主干版本与分支版本:
目的:多版本并行开发
svn cp svn://192.168.10.1/imooc/ svn://192.168.10.1/imooc/trunk -m " " 创建主干版本
svn cp svn://192.168.10.1/imooc/trunk svn://192.168.10.1/imooc/branch -m " " 创建分支版本
管理svn,需重启操作生效
hooks钩子应用
钩子:当执行某些特定操作时触发执行预先设定好的任务
可查看版本库中hooks文件夹的模板
前缀:
start 表示数据传输开始之前
pre 数据传输之后,写入版本库之前
post 写入版本库之后
添加钩子时需要把后缀删掉然后按需求编写shell脚本
版本库精简/备份版本库
停止版本库
killall svnserver
备份需要的版本库
例如备份版本6到16的版本库
svnadmin dump /svnroot/imooc -r 6:16 > ~/imooc.repo
创建一个新的版本库
svnadmin create /svnroot/newimooc
加载备份数据
svnadmin load /svnroot/newimooc < ~/imooc.repo
复制所有配置文件到新版本库
运行版本库
客户端需要重新检出工作副本
注意:精简之后版本库的版本号还是从1开始往后递加
备份版本库第二中方法
停止版本库
把整个版本库目录打包压缩
复制解压到新服务器上并解压
在新版本库上运行