SVN版本控制学习

版本控制的作用

  • 让版本库中的任意一个文件恢复到任意一个历史版本
  • 追溯任意代码文件的任意一行在什么时间被什么人修改过

常用版本控制

特性 CVS SVN GIT
并发修改 1 1 1
并发提交(0:每个文件都有记录版本号 1:批量文件版本号) 0 1 1
历史轨迹(0:不支持更名 1:支持更名) 0 1 1
分布式(0:集中式 1:分布式) 0 0 1

SVN

Linux系统下的SVN安装

Ubuntu
apt-get install subversion
CentOS
yum install subversion

服务端命令

svnserve - 控制svn系统服务的启动等
svnadmin - 版本库的创建/导出/导入/删除等
svnlook    - 查看版本库的信息等

客户端命令

svn - 版本库的检出/更新/提交/重定向等

创建版本库

svnadmin create /path/repos

删除版本库

rm -rvf /path/repos

版本库配置及权限分组

配置文件位于 /path/repos/conf/
authz - 配置用户组以及用户组权限
passwd - 配置用户名和密码
svnserve.conf - 配置默认权限、权限配置文件及密码配置文件

运行版本库

svnserve -d -r /path/repos

SVN版本库访问

svn checkout svn://192.168.0.130/ios --username xxx --password xxxx
svn co svn://192.168.0.130/ios --username xxx --password xxxx

checkout与export的区别和使用

checkout-检出(检出的工作副本中含有.svn文件夹)
export-导出(文件状态:无版本控制)
svn checkout -r 2 //检出版本2 (不加-r默认最新)
svn export -r 3 //导出版本3     (不加-r默认最新)

.svn记录着工作副本最后一次更新后的文件状态
.svn标记工作副本的一切变化

常见SVN客户端命令
svn add - 添加到版本控制

svn add index.html (添加文件)
svn add css  (添加目录以及递归添加目录下内容)
svn add css --non-recursive (只添加目录)
svn add * --force(批量增加)
svn add * (批量增加,已经存在的目录不会处理)

svn commit - 提交修改到服务端(创建一个新版本号)

svn ci -m “this is indexindex.html 
svn commit -m “this is indexindex.html 
svn commit -m “all” * 提交所有改动 

svn update - 更新工作副本

svn up (全目录更新)
svn up -r 1 index.html (index.html更新到版本1状态)
svn up * (所有文件更新到最新版本)

svn delete - 从版本库中删除文件或目录

svn rm index.html -m “删除index.html”
svn ci -m “删除index.html”

svn diff - 版本差异比较

svn di index.html (比较工作副本与最后一次更新的差异)
svn di -r 2 index.html (比较工作副本与版本2的差异)
svn di -r 2:3 index.html (比较版本2与版本3的差异)
svn di (所有差异文件)

svn mkdir - 创建目录并增加到版本控制

svn mkdir doc 

svn cat - 不检出工作副本直接查看指定文件

svn cat svm://192.168.0.130/index.html

工作副本还原

svn revert index.html
svn revert * (仅仅扫描当前目录)
svn revert --recursive * (递归扫描所有目录)

冲突

二进制冲出与树冲突
发生树冲突的文件都不是二进制文本文件
树冲突无法精确到行并且处理树冲突必须处理整个文件

什么是冲突以及冲突的产生条件
更新到的数据与工作副本的修改正好在同一处

如何尽可能的避免冲突
经常update

如何解决冲突
发现冲突优先选择(p)推迟处理
确定处理方式后再解决冲突
svn resolve index.html (处理冲突)
svn resolved index.html (处理完冲突)
svn ci -m “” index.html

锁定与解锁

svn lock - 锁定文件,防止其他成员对文件进行提交
svn lock index.html
svn ci -m “” --no-unlock index.html (防止默认提交自动解锁)
svn unlock -解锁文件
svn unlock index.html

SVN进阶应用
svn list - 列出当前目录下处于版本控制的所有文件

svn ls (不会列出无版本控制文件,默认列出顶级目录)
svn ls --recursive (递归列出所有版本控制文件)
svn ls -v (详细信息)
svn ls -v --recursive

svn status -列出工作副本的文件(夹)的状态

svn st
?无版本控制
D 已被标记从版本库中删除
M 已被编辑过
A 已被标记增加到版本控制中
R 文件被替换
C 文件存在冲突
!文件缺失

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

svn log
svn log index.html (查看某个文件相关)

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

svn info
svn info index.html
svn info --xml (xml方式查看)
svn info --xml >> info.xml(保存xml文件)
cat info.xml

svn merge - 合并分支

合并主干上的最新代码到分支上
cd feature001
svn merge svn://192.168.0.130/ios/trunk
解决冲突、编译、调试、提交

分支合并到主干
cd trunk
svn merge --reintegrate svn://192.168.0.130/ios/branches/feature001
编译、验证、提交 
svn ci -m “合并”

注意事项:
不管是从trunk合并到branch还是最终从branch合并回trunk,在每次合并前最好先update,然后将本地的修改先全部commit,保护好现场,万一合并不理想随时都可以revert合并完成后看是否能正确编译,然后测试验证,最后将合并后的改动提交到repository

多版本库解决方案

A:端口号(版本库可以创建在任意位置,端口号容易混淆)
TCP/IP协议规定端口号范围为0-65535
0-1023 公认端口
1024-49151 注册端口
49152-65535 私有端口
svnserve -d -r /path/repo --listen-port 3691 (开启服务前需要配置)
killall svnserve (需要重新配置开启服务)

B:路径(多个版本库必须要在同一目录,无需分配端口号) 推荐使用
svnserve -d -r /svnroot/

svn copy

工作副本 -> 工作副本
svn cp index.html copy.html 
svn cp -r 4 index.html copyv4.html   (复制某个版本文件)
svn cp index.html about.html ./temp (复制多个文件到指定文件夹)

工作副本 -> 版本库(不支持跨库,提交不支持跨库)
svn cp index.html svn://192.168.0.130/ios/target.html -m “提交复制文件”
svn update

版本库    -> 工作副本(允许跨库)
svn cp svn://192.168.0.130/ios/target.html demo.html

版本库    -> 版本库(不可跨库)

主干版本与分支版本

svn cp svn://192.168.0.130/ios/ svn://192.168.0.130/ios/trunk -m “创建主干分支”
svn cp svn://192.168.0.130/ios/trunk  svn://192.168.0.130/ios/branches/dev1.0.0 -m “创建dev1.0.0

SVN高级应用

HOOKS钩子的应用
什么是钩子?
当执行某些特定操作时触发执行预先设定好的任务

svn info svn://192.168.0.130/ios --xml >> /root/repo.xml
重启生效
svn killall
svnserve -d -r /root

版本库精简与丢弃

killall svnserve
svnadmin dump /svnroot/ios/ -r 6:16 > -/ios.repo (备份版本库6-16版本)
svnadmin create /svnroot/newios
svnadmin load /svnroot/newios/ < -/ios.repo  (加载后6-16 变成1-11)
配置文件conf
svnserve -d -r /root
版本库精简后需要重新checkout,否则版本号不一致

版本库迁移与switch重定向

killall svnserve
把 /svnroot/ios 压缩成repo.zip
复制repo.zip到新服务器并解压
在新服务器上运行repo版本库
svn sw --relocate svn://192.168.0.130/ios svn://192.168.0.130/newios

SVN常见问题总结

忘记配置svnserve.conf
运行版本库的路径问题
svnadmin dump/load 管道符号问题

你可能感兴趣的:(svn)