版本控制的作用
常用版本控制
特性 | 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 index” index.html
svn commit -m “this is index” index.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 管道符号问题