SVN
SVN使用
-
基本操作
- svn checkout:把项目源码下载到本地,只需要做一次
- svn update:将本地的源码更新至服务器的最新版本
- svn commit:将本地的源码更新内容提交到服务器
- 提醒:每天下班前commit可运行版本,上班前update前一天所有代码
-
SVN使用环境
- 要想利用SVN管理源代码,必须得有2套环境
- 服务器
- 用于存储客户端上传的源代码
- 可以在Windows上安装Visual SVN Server
- 大部分情况下,公司的开发人员不必亲自搭建SVN服务器
- 客户端
- 上传本地的源代码到服务器,或者更新服务器的代码到本地,保持同步
- 可以在Mac上使用命令行、Versions、Cornerstone、Xcode
- 开发人员就属于客户端这个角色
- 服务器
- 要想利用SVN管理源代码,必须得有2套环境
Visual SVN Server软件
-
服务器端安装配置
- 在电脑上安装虚拟机
- 安装Visual SVN Server
- Standard Edition
- 仓库地址、安装位置
- ServerPort 端口号:80
- start Visual SVN
- 面板介绍
- Repositories:创建仓库
- users
- groups
- 如何创建仓库
- 创建一个空的仓库
- 设置权限
- Properties
- add - 把创建的manager添加进去
- read/write
- Properties
- 红色的星号表示可以被访问
- copyurl
- 在虚拟机里面复制copy的url打开
- 链接仓库
- 虚拟机理解成为远程服务器,本地的safari链接不上url
- 本地访问的时候,是计算机名称访问的
- 其他地方访问时通过ip地址
- 如何获得ip地址(虚拟机里)
- cmd
- 输入ipconfig
- 用ip地址把计算机的名称换掉
- 弹框输入用户名和密码就可以连接上仓库了
- 创建文件Doc/Code
- 创建用户(项目经理要做的)
- name
- password
- confirmpassword
客户端软件使用
与xcode集成
项目经理对项目进行初始化操作
1.项目经理先创建一个空的仓库,创建用户名(账号:manager密码:manager),设置访问权限
-
2.项目经理使用终端连接到SVN服务器,并且把仓库下载到本地
- 通过url连接上
- cd
- pwd看到当前路径
- 下载仓库到本地
$ svn checkout http://172.16.3.128/svn/Demo/ -- username = manager -- password = manager
- 路径为仓库地址路径
- 需要把计算机名称改为ip地址
- 后面要跟上用户名和密码
- Demo
- Code
- .svn隐藏文件就是svn版本库
- 如何查看隐藏文件
- 显示隐藏文件
- $ defaults write com.apple.finder AppleShowAllFiles YES&&killallFinder
- 不显示隐藏文件
- $ defaults write com.apple.finder AppleShowAllFiles NO &&killallFinder
- 如何查看隐藏文件
-
3.项目经理进入到code路径
- ls - la
- cd Code/
- pwd
4.项目经理 创建空的文件 touch main.m
-
5.查看文件状态
-
$ svn status
- 打印 ? main.m
- ?表示该文件没有被svn管理
-
-
6.把main.m添加到SVN的版本库
-
$ svn add
文件名(main.m) - 状态变为A :A表示新添加了文件
-
-
7.把本地的修改(mian.m) 提交到远程的仓库
- $ svn commit - m"注释" main.m
- m 表示message
注意:新创建的文件默认不会被SVN管理,需要使用add指令来添加
-
8.项目经理命令行删除文件
- $ svn remove main.m
- D :代表delegate,表示该文件被删除
-
9.项目经理把本地的更改提交到远程的svn服务器
- $ svn commit - m "删除了文件"文件名称(可以省略)
-
svn相关命令行的简写
- svn checkout == svn co
- svn status == svn st
- svn commit == svn ci
- svn update == svn up
- svn remove == svn rm
ruby升级
因为准备项目中使用bootstrap,在安装bootstrap过程中提示需要Ruby的版本在1.9.2以上,而且目前使用的Ruby版本是Mac系统自带的1.8.7.所以需要对Ruby进行升级
-
安装RVM
- RVM:Ruby version manager,ruby版本管理器,包括ruby的版本管理和gem库管理
- curl- L get.rvm.io | bash - s stable
- 等待一段时间后就可以成功安装好RVM
- $ source ~/.bashrc
- $ source ~/.bash_profile
- 测试是否安装正常
- rvm - v
- 1.27.0说明升级好了
-
用RVM升级Ruby
- 查看ruby版本
- ruby - v
- 列出所有版本
- rvm list known
- 安装ruby2.3
- rvm install 2.3
- ruby有很多依赖,会下载很多的包
- 再安装cocoapods
- 查看ruby版本
-
svn如何查看版本信息
- cd
- 更新获得最新的版本信息
- $ svn update
- 查看版本信息
- $ svn log
新同事加入开发涉及操作
- 给新同事分配一个SVN账号 (账号:zs密码:zs)
- 新同事需要连接到SVN的远程服务器,下载仓库到本地
- $ svn checkout http://172.16.3.168/svn/Demo/ -- username = zs -- password = zs
- 开两个终端
- 一个项目经理manager
- 给zs创建/分配账号
- 项目经理更新获得最新的仓库信息
- $ svn update |svn up
- 项目经理创建一个人类
- touch Person.h Person.m
- $ svn status
- $ svn commit - m "创建了人"
- 一个是新同事zs
cd
svn checkout http://172.16.3.168/svn/Demo/ -- username = zs -- password = zs
cd
ls - la
zs开始开发,创建了一个🐶类
$ touch Dog.h Dog.m
-
$ svn status
- ?? 没有被svn管理呢
把新创建的文件,添加到svn的版本库里面
- $ svn add Dog.h Dog.m$ svn add * 把当前路径下面所有没有被SVN管理的文件都添加到svn的版本库中
- warning :不用理会查看状态 svn status
把本地的修改提交到远程仓库
- $ svn commit - m "创建了🐶类"Dog.h Dog.m
- Dog.h Dog.m可以省略不写,省略表示把所有文件的更改都提交到远程仓库
- 一个项目经理manager
SVN版本回退操作
- svn log 查看版本信息
- 版本回退:
- 回到上一个版本
- 版本回退涉及的两种情况
- 修改了内容,但是该修改还没有提交到svn仓库,需要回退到最新的版本(取消当前修改)
- zs
- cat Dog.h
- echo "wangwang" >>Dog.h
- cat Dog.h
- svn status
- M:表示该文件被修改
- 提交更改到远程的服务器
- svn commit - m "修改了Dog.h文件"
- 继续输入信息
- echo "miaomiao" >> Dog.h
- 按键盘的上箭头,就可以查看状态
- 取消更改(不在Dog.h里面输入miaomiao)
- svn revert Dog.h
- zs
- 修改了内容,并且该修改已经被提交到SVN仓库,需要回退到上一个版本(取消修改)
- 修改了Dog.h文件
- 把修改的文件提交到SVN服务器
- $ svn commit - m "HelloDog" Dog.h
- 此时需要取消对Dog.h文件的修改(需要回退到上一个版本)
- 回退到特定的版本
- $ svn update - r(版本号)
- $ svn update - r9
- 不能直接commit(提交),如果客户端的版本号,低于服务器端的版本号,不能提交成功
- 回到最新版本 $ svn update
- 先更新回到最新的版本信息
- $ svn update
- 合并两个版本的文件
- $ svn merge - r(当前的版本号):r(要回退到的版本号) 文件名称
- $ svn merge - r9 : r8 Dog.h
- U:版本回退的操作
- 重新提交更改到SVN服务器
- $ svn commit - m "Dog类回退到上一个版本" Dog.h
- 回退到特定的版本
- svn - log查看版本信息
- 修改了内容,但是该修改还没有提交到svn仓库,需要回退到最新的版本(取消当前修改)
多人开发可能会出现的冲突
- 项目经理修改了main.m文件,往里面添加了一行内容(版本号10)
- $ echo "main 项目经理" >>main.m
- 项目经理把修改提交到服务器(版本号11)
- $ svn commit - m "修改了文件,提交到仓库" main.m
- 同一时间,zs也修改了main.m的同一位置(版本号10)
- $ echo "mian zs"
- 张三也提交修改到服务器,此时提示不能提交成功(报错:版本已经过期)
- $ svn commit - m "张三修改了文件,提交"main.m(报错 outofdate)
- 产生冲突原因:两个人修改了同一个文件的同一个位置
- 解决:张三应该先更新,获得最新的版本信息,一更新就会产生冲突
- $ svn update
- df 会列出哪里有冲突
- p 稍后处理
- mc 以我的为主
- tc 以服务器的为主,服务器端的内容就会覆盖本地的
- 解决冲突的具体方法详解(掌握)
tc:表示用服务器的内容来覆盖掉本地的内容,此时本地的仓库和服务器端的仓库是一样的
-
mc:表示使用客户端的内容来覆盖掉服务器端的内容,并且本地的版本号会加1
- $ svn commit - m "我是zs" main.m
- 把更改提交到服务器,版本号+1,会把服务器端的内容覆盖掉
-
p:
- 表示延迟处理冲突,需要手动解决冲突
- 向左向右和等号的提示,把不需要的删掉,向左、等号、向右的箭头必须要删除,其余的可以随便处理,一般情况下是都保留
- 通过命令行告诉svn冲突已经被解决了
- $ svn resolved main.m
- 把修改提交到远程的仓库
- $ svn commit - m “解决了冲突”main.m
SVN图形化界面工具简单说明
-
图形界面工具
- cornerstone
右键,新建空的仓库
右键,新建两个文件夹Code/Doc
创建管理者
配置权限 add 设置为可读可写
-
copyURL
- 把计算机的名称改为ip,运行cmd-ipconfig
-
连接上远程仓库选中HTTP Server
- Protocol:HTTP
- Sever:ip地址
- Pepository path:路径
- port:80
- Nickname:昵称可以随便传
- 设置账号密码
-
把远程仓库下载到本地
- 左上角的checkout
- Check out As :名称
- Where:放在哪个位置路径下面
- When Complete:打开/nothing
- Revision:仓库的版本号
- Format:git的版本号,一定要选择1.7
-
项目初始化配置
- 创建一个项目,把项目放到code里面,不要勾选create git
- ? :文件当前并没有被SVN管理,在这里是Xcode反应迟钝,不需要做add操作
- 步骤:
-
先连接上远程仓库
-
把远程仓库下载到本地
- 使用xcode创建一个新的项目(该项目中的所有的文件,默认会被添加到当前的svn版本库中)
- 把本地的更改,提交到远程的服务器仓库
- 点击commit指令之后会弹出一个框(该软件识别出了几个文件,这几个文件通常需要被忽略的),点击ignore,输入注释,然后点击commit changes
-
- 设置仓库的忽略文件
- 还有一些文件是需要忽略处理的
- 记录断点信息
- 导航菜单打开状态的文件
- 步骤:
- 找到xuserdata文件(2个)然后手动删除
- 把更改提交到远程的仓库
- 重新生成这两个文件(随便删除项目中的一个空行,或者是打上一个断点,然后运行程序)
- 关闭xcode,更新本地仓库,重新提交本地的代码到远程的服务器,xcuserdata就会被忽略(或者手动忽略,ignore)
- 先点击commit,选中ignore,点击commit changes 提交(报错)-->先更新 然后再提交
- 还有一些文件是需要忽略处理的
- 总结:使用cornerstone进行项目初始化并完成忽略操作
- 连接上仓库,并且下载到本地
- 使用xcode新创建一个项目到code文件路径中,把xcode关闭
- 把本地的修改提交到svn服务器(commit) - 会弹出一个框,选中ignore,会默认的做一个忽略处理 - 弹出一个一个输入注释的界面,点击右下角commit andChange
- 继续进行忽略操作,手动的删除两个XuserData文件(右键delete),把删除操作提交到svn服务器(commit change)
- 重新生成这两个文件(打开xcode,随意修改一点代码,或者是添加一个代码,运行程序就可以了)
- 手动的忽略这两个文件然后提交 直接提交 在提交的时候选中ignore选项,提交发现报错(本地的文件和服务器端的文件不一样) -- 先更新然后再提交
- 验证忽略操作已经完成
- 在项目中修改某一个文件,点击source control 点击commit 提交如果修改了一个文件,提交的时候也只有一个文件显示提交,那么就说明已经完成忽略处理
- 图形化界面工具多人开发的冲突处理
- 点击❓四种解决冲突的方法
- 选择 左边的或者右边的,两个都先保存一下
- 解决完冲突之后再提交
- 点击❓四种解决冲突的方法
Xcode使用storyboard注意点
- Xcode5之后支持已经很好了
- 如果多人同时修改xib,冲突如何解决
- xib坏掉了不能打开
- 右键 open as - source code
- <?xml version >
- 先找到subviews(开始标签)
- 找到结尾标签(/subviews)
- 在开始和结尾之间找问题
- 嵌套包含的问题
- 手动调整
- 怎么解决约束混乱的问题
- textField的约束设置到了button里面了
- 手动调整,把属于谁的约束给谁,更新约束
- 嵌套包含的问题
- xib坏掉了不能打开
- 建议
- 建议在开发中分工明确,尽量避免多人同时修改一个文件
- 在开发中尽量每完成一个功能就提交一次,应该在每次开发前都做一次更新操作
Xcode使用静态库注意点
- 静态库
- 想给别人用我的框架,又不想让别人看到源文件和实现,打包成静态库就可以了
- regexLib(正则表达式:用户名密码的约束)
- .a文件是打不开的
- 可以把静态库理解为框架 ,把它拖到项目里
- I:表示忽略,.a文件默认是忽略的,需要手动完成添加操作
- showInfinder
- cd
- ls - la
- libRegex.a
- svn status
- svn add libRegex.a
- commit 添加了静态库文件
- I:表示忽略,.a文件默认是忽略的,需要手动完成添加操作
- 如果在项目中用了静态库,那么,.a文件默认是被忽略的,需要使用命令行手动的对.a文件进行add操作,把静态库文件添加到SVN的版本库中
使用Xcode进行checkout
- 李四加入开发,先分配一个SVN的账号
- 李四不喜欢使用图形界面工具,喜欢使用Xcode
- 使用Xcode连接到仓库,下载到本地
- 偏好设置preference
- Accounts 点击+
- Address
- type
- authreiication
- 出现repository就表示连接到了
- 点击checkout,通常在最下面,选择路径,下载仓库
SVN目录规范的介绍(团队负责人)
-
目录规范
- trunk:主干,当前开发项目的主目录
- branches:分支目录,添加非主线功能的时候使用,开发测试之后,可以合并到主干项目中
- tags:标记目录,通常作为重大版本的备份
-
SVN目录使用的案例
- 某团队计划开发一款陌陌项目
- 此项目初期已经有部分基础代码
- 研发团队在此基础代码上经过3个月的努力,开发了一个功能相对完备的v1.0版本上线推广,并取得了良好的效果(备份到tags)
- 由于市场反馈良好,团队开始着手v2.0版本的开发工作
- 就在v2.0版本开发进行中,发现v1.0版本中有一个严重的bug,如果不及时修改,将造成严重的后果
- 研发团队收到bug报告后,立刻安排人员对v1.0版进行修复,但其他研发人员则继续开发v2.0版本的新功能
- 修复bug的人员很快就找到问题的原因,并对bug进行了修复,并且发布了v1.1版本供用户升级,因此没有造成重大的损失
- bug修复后,研发人员将修复后的代码整合到研发主线中来,这样就可以保证今后发布的后续版本中不会再出现此问题
- 就这样,整个团队在大家的共同努力下,有条不紊的进行着
- 具体流程
- 某开发团队开发了一款应用
- 一段时间后,1.0版本已经开发完毕
- 商品上架,把1.0版本发布到appstore,对1.0版本进行备份
- 开发团队继续开发2.0版本
- 2.0版本开发到一半的时候,市场人员反馈发现,1.0版本中存在重大的bug,需要马上修复
- 开发团队指派一个人(zs)修复1.0版本的bug,其他的人员继续在主干中开发2.0版本
- zs先把1.0版本(备份)拷贝一份,建立一个分支
- 在分支中解决bug
- 修复了1.0版本bug的新版本,命名为1.1版本
- 商品上架,把1.1版本发布到appstore,对1.1版本进行备份
- 在主干上面合并分支,解决正在开发的2.0版本中也存在的bug
- 删除分支,继续开发2.0版本
SVN演练
- 打开虚拟机
- 创建一个仓库MOMO,创建一个标准的仓库,生成三个文件夹,默认没有任何人访问
- 创建用户,设置权限
- copyURL,连接上仓库
- 使用图形界面工具
- 连接仓库,下载仓库到本地
- Xcode完成初始化处理
- 创建项目,放到trunk文件夹下面
- commit - ignore
- 手动删除继续忽略的文件 - commit
- 重新生成这两个文件(空行、断点、运行),提交(或者手动忽略),更新操作,再点击commit
- 修改文件,使用xcode提交,只提交一个文件,说明忽略操作已经完成
- 开始开发1.0 - 提交
- 开发完毕1.0 - 提交
- 对1.0版本进行备份
- 图形界面工具中,右键tag
- log message :完成了1.0版本momo的开发,基本功能 - 提交tags里面就有了备份,更新本地客户端
- 开发团队继续开发2.0版本 - 提交
- 发现1.0版本中存在一个bug - commit
- 指派项目经理修复1.0版本的bug,建立一个分支
- 先把1.0版本拷贝一份(branches) momo1.0
- 本地客户端更新操作
- 项目经理开始修复bug
- 刷新command + r ,然后再进行备份 tag ,1.1版本,版本的功能commit
- 其他人员在主干上继续开发2.0版本
- 解决主干trunk上面的bug,合并分支(操作本地仓库,选中本地的主干,点击merge,如果有惊叹号需要更新一下,merge from),commit提交
- 删除分支,右击delete(注意:删除分支要连接远程服务器位置删除分支)