SVN

SVN

SVN使用

  • 基本操作

    • svn checkout:把项目源码下载到本地,只需要做一次
    • svn update:将本地的源码更新至服务器的最新版本
    • svn commit:将本地的源码更新内容提交到服务器
      • 提醒:每天下班前commit可运行版本,上班前update前一天所有代码
  • SVN使用环境

    • 要想利用SVN管理源代码,必须得有2套环境
      • 服务器
        • 用于存储客户端上传的源代码
        • 可以在Windows上安装Visual SVN Server
        • 大部分情况下,公司的开发人员不必亲自搭建SVN服务器
      • 客户端
        • 上传本地的源代码到服务器,或者更新服务器的代码到本地,保持同步
        • 可以在Mac上使用命令行、Versions、Cornerstone、Xcode
        • 开发人员就属于客户端这个角色
  • Visual SVN Server软件

  • 服务器端安装配置

    • 在电脑上安装虚拟机
    • 安装Visual SVN Server
      • Standard Edition
      • 仓库地址、安装位置
      • ServerPort 端口号:80
      • start Visual SVN
    • 面板介绍
      • Repositories:创建仓库
      • users
      • groups
    • 如何创建仓库
      • 创建一个空的仓库
      • 设置权限
        • Properties
          • add - 把创建的manager添加进去
          • read/write
      • 红色的星号表示可以被访问
        • 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
  • svn如何查看版本信息

    • cd
    • 更新获得最新的版本信息
      • $ svn update
    • 查看版本信息
      • $ svn log

新同事加入开发涉及操作

  • 给新同事分配一个SVN账号 (账号:zs密码:zs)
  • 新同事需要连接到SVN的远程服务器,下载仓库到本地
  • 开两个终端
    • 一个项目经理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可以省略不写,省略表示把所有文件的更改都提交到远程仓库

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
    • 修改了内容,并且该修改已经被提交到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查看版本信息

多人开发可能会出现的冲突

  • 项目经理修改了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里面了
          • 手动调整,把属于谁的约束给谁,更新约束
  • 建议
    • 建议在开发中分工明确,尽量避免多人同时修改一个文件
    • 在开发中尽量每完成一个功能就提交一次,应该在每次开发前都做一次更新操作

Xcode使用静态库注意点

  • 静态库
    • 想给别人用我的框架,又不想让别人看到源文件和实现,打包成静态库就可以了
    • regexLib(正则表达式:用户名密码的约束)
    • .a文件是打不开的
    • 可以把静态库理解为框架 ,把它拖到项目里
      • I:表示忽略,.a文件默认是忽略的,需要手动完成添加操作
        • showInfinder
        • cd
        • ls - la
        • libRegex.a
        • svn status
        • svn add libRegex.a
        • commit 添加了静态库文件
    • 如果在项目中用了静态库,那么,.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(注意:删除分支要连接远程服务器位置删除分支)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容