美文网首页iOS面试闪充
程序员面试闪充--版本管理之SVN

程序员面试闪充--版本管理之SVN

作者: 谦谦君子修罗刀 | 来源:发表于2018-01-26 19:04 被阅读30次

    在软件开发过程中,通常一个软件项目要靠多人合作完成的。而在此过程中的修修改改一定会存在一些不可避免的问题。可能一不小心就闹出个大乱子呢。

    一、源代码管理的问题

    1)无法后悔:乱删改代码,一旦Xcode奔溃关闭,将无法回退。若是个人开发,所有的代码都将在一台电脑上保存,万一丢失,后果不堪设想。

    2)浪费资源:对项目添加新功能,备份。

    3)版本混乱:因版本备份过多而造成混乱,难以找回正确的版本

    4)代码冲突:多人操作同一个文件

    5)权限控制:无法对源代码进行精确的权限控制

    6)追究责任:项目出现严重bug,无法精确得知是谁所做

    …………

    而源代码工具就是为了解决上述问题而产生的

    二、管理工具的作用

    1)能追踪一个项目从诞生到定案的过程

    2)方便查阅特定版本的修订情况(使用简单,不会增加工作量)

    3)检验开发人员是否合格(是一位合格的软件开发人员必须掌握的技术)

    常见的源代码管理工具

    1)CVS:开启版本控制之门,1990年开发,是“远古时代”的主流源代码管理工具

    2)SVN(Subversion):集中式版本控制之王者。是CVS的接班人,速度更快功能更强大,在国内的使用率非常之高(70%-90%)

    3)GIT: 是一款分布式源代码管理工具,目前被越来越多的开源项目使用

    三、SVN的搭建

    1) 基本操作

    分为服务器(svn的仓库)和客户端。

    • 客户端通过svn checkout将服务器代码完整下载到本地(只需要做一次)

    • 通过svn commit将本地修改的内容,提交到服务器(每天下班前:commit一次可运行版本)

    • 通过svn update将服务器最新的代码下载到本地(若客户端已经有代码)

    2)使用环境

    • 服务器

    用于存储客户端上传的源代码

    Windows:Visual SVN Server

    (大部分情况下,公司的开发人员不必亲自搭建SVN服务器)

    • 客户端

    用于上传本地代码到服务器,或者更新服务器代码到本地,保持同步。可以在mac上使用命令行、Versions、Cornerstone、Xcode

    3)服务器的搭建

    下载一个Visual SVN Server安装包

    但是要注意这个软件只能在windows系统上搭建

    勾选安装控制台和服务器,默认勾选添加一个控制台。

    选择标准版本,企业版有更多功能,但是会涉及到收费项目。

    确定仓库存放的位置。下面小框最好不要进行勾选,SVN一般在公司内网,所以不会有截取数据的危险,所以不需要选择https,因为安全认证会浪费时间。

    更新完成后是否要发emial给用户,安装完成之后是否打开

    下面进行安装后的操作

    • 创建仓库
    • 选择是否为空项目

    • 设置访问权限

    可以设置用户的访问权限。也可以通过Properties选项来修改权限。

    • 添加用户

    第一种方式添加 create user

    第二种方式添加

    这里还可以设置分组,设置为组的是为了方便管理。在以后的项目中,可以直接使用本小组的成员。

    • 访问

    选中项目名选择Copy URL to Clipboard,复制出URL回车就会弹出弹窗。输入用户和密码就能操作SVN的仓库。

    接下来可以看见结果,每操作仓库一次,版本号就会加一

    若要在mac上进行访问通过命令行输入ipconfig 找到windows上的ip地址。

    之后在mac的浏览器上输入ip地址/svn/仓库名就能访问了。

    四、操作命令行

    1)项目经理初始化项目

    • 项目经理将服务器已有的内容下载到本地

    svn checkout 服务器地址 --username=用户名 --password=密码

    • 项目经理初始化项目

    不要管.svn 它用来管理下面的东西

    创建一个main.m文件

    touch mian.m

    接着可以给main.m文件添加内容

    查看状态

    svn status

    文件的状态

    添加文件

    svn add main.m

    • 提交代码到服务器

    svn commit -m "初始化项目" main.m :将main.m上传到服务器

    在命令行中可以看到,每次操作了服务器,它的版本号就会进行加1

    2)它人加入开发

    • 将服务器的所有内容下载到本地

    svn checkout 服务器地址 --username=用户名 --password=密码

    自此,第二人张三也可以加入到开发中。但是要先进入到工作目录中,否则svn无法对第二人的代码进行管理。

    创建一个新的类

    cd code
    
    touch person.h persion.m 
    

    之后,经理更新svn就可以看到张三上传的文件了

    svn update

    3)命令行的简写

    svn checkout =  svn co
    
    svn status = svn st
    
    svn commit = svn ci
    
    svn update = svn up
    

    4)版本回退

    • 修改了未提交退回到本版本

    svn update -r版本号

    比如

    svn update -r7

    • 已经提交了想退回到上一个版本

    先回退到某个版本,观察是否是自己想要的那个版本

    svn update -r6

    更新到最新的版本,这样本地版本号就不会低于服务器号

    svn update

    合并版本号,并且指明回退的文件

    svn merge -r新版本:要回退的版本 文件名
    
    svn merge -r7:6 persion.h
    

    最后提交代码到服务器上

    svn ci -m "回退到版本x"

    5)删除文件

    当要删除一个文件时,直接移到废纸篓的方式只能是子子孙孙无穷尽。

    svn remove 文件名
    
    svn rm person.m
    
    svn ci -m "删除了person.m"
    

    6)查看版本信息

    svn update   //更新服务器最新的内容
    
    svn log   //查看版本信息
    

    7)新人加入,版本冲突

    李四和张三同时修改了文件,李四先提交上去,而张三修改后再提交会发现,由于本地版本号低于服务器版本号而过期。所以要先更新项目。

    而这种更新会产生代码冲突……

    解决方法:

    • df(diff-full):在命令行中展示所有的不同

    • e(edit):在命令行中来编辑冲突,r(resolved)命令告诉服务器已经解决了冲突。

    • mc(mine-conflict):用本地的代码来覆盖服务器的代码

    • tc(theirs-conflict):用服务器的代码来覆盖本地代码

    • p(postpone):延时解决冲突,会展示所有冲突的文件,手动解决冲突

    mc和tc都无法完美的解决冲突问题,所有选择p。之后会在person类中出现下面三个文件。

    打开源文件,手动修改冲突

    解决好之后,再命令行输入命令resolved告诉服务器已经解决好冲突

    svn  resolved 文件名
    
    svn resolved person.h
    

    如此,就可以删除掉刚刚忽如其来的那几个文件

    • 避免冲突

    尽量在修改文件之前,先执行update命令

    如果修改公共文件,最好先与同事沟通,修改完成后,再让对方更新。

    五、Cornerstone图形化界面工具的使用

    点击+号添加一个仓库,接着要输入各类信息。其他的信息都可以选择,而端口号可以通过右键properties属性,在弹窗中选择Network一栏查看。

    之后下载通过checkout将服务器上的代码下载到本地。然后选择最新的版本保证项目在svn的管理范围内。

    要注意在svn管理之下,用xcode创建项目时,千万不能勾选git repository。

    在第一次提交版本之时,不要选择xcode提交,因为这可能会产生某些错误。

    提交之后要做忽略操作。用户数据不需要共享,所以将它删除掉。

    删除完成之后,选中整个项目,进行提交。之后使用xcode提交代码。

    而当我们只改了一个代码,xcode却需要我们提交许多其他的代码,而这些代码是要在cornerstone中忽略的。

    忽略之后还要进行update。因为在做了忽略操作时,project.xcworkspace这个文件已经进行了修改。所以要对服务器进行更新。

    • 需要忽略的文件

    xcode会默认记录之前停留文件,下次打开依然停留在该文件

    xcode会默认记录之前目录的打开情况

    断点信息不需要进行共享

    而这些信息都会存在xcuserdata文件里

    • 冲突处理

    若两个人都修改了同一个文件就会冲突

    此时点击产生冲突的问号按钮,可以发现四种选项的调整方法。第一种是保留两者,服务器代码放上面,而本地代码放上面;第二种是保留服务器代码;第三种则是保留本地代码;最后一种是保留两者,但是将本地代码放在服务器代码之上。

    最后再讲修改好的代码进行提交

    六、使用svn的注意点

    1. 如果使用到静态库必须使用命令行将静态库添加到svn的管理之下

    svn add libRegex.a

    1. 如果使用到了storyboard要特别注意

    因为多人开发产生了冲突,有可能会报错无法打开storyboard的错误。此时我们可以选择打开方式为Source Code去修正它。

    所以这里温馨提示,在项目开发中,如果能使用xib,尽量使用xib。如果说在项目中使用到了storyboard,尽量保证只有一个人操作storyboard。因为多人操作很可能会产生冲突,而解决冲突十分恶心。

    七、目录规范

    一般的项目都包含了三个文件夹。

    Trunk:主干,当前开发的主目录

    Branches:分支目录,添加非注销功能

    Tags:标记目录,通常作为重大版本的备份

    svn目录使用案例:

    在主干中进行开发,项目开发完成之后提交1.0版本,此时要备份到tags中,作为重大版本的备份。再来着手2.0版本的开发。而市场反应1.0版本出现了一个严重的bug,此时则需要将tags文件夹的1.0版本复制到branches中修复bug,等解决之后,提交上线,将它拷贝到tags中作为1.1版本。最后再与主干中的2.0版本合并起来。

    八、面试题

    1)为什么要用源代码管理工具?

    答:能追踪一个项目从诞生到定案的过程、方便查阅特定版本的修订情况、检验开发人员是否合格。

    1. 请解释一下svn中几个比较重要的操作:checkout、update、commit

    答: Checkout:将服务器上最新的代码仓库下载到本地;Update:从服务器上下载最新的代码;Commit:将工作提交到服务器。

    3)最常用的版本控制工具是什么?原理是什么?

    答:最常用的版本控制器有git和svn两种。svn是集中式代码管理,核心是服务器。所有开发者在开始新一天的工作之前必须从服务器获取代码,然后开发,最后解决冲突并提交。所有的版本信息都放在服务器上。

    而git则不存在主库这样的概念。每一份库都可以独立使用,任何两个库之间的不一致之处都可以合并。

    4)在SVN版本库浏览器中,使用()指令可以查看所选文件或目录的日志?

    A、show log B、Rename C、Blame D、Save as

    答:选A。Rename是重命名,Blame用于追溯源代码,save as则是另存为的意思。

    原文链接:SVN讲解视频


    相关文章

      网友评论

        本文标题:程序员面试闪充--版本管理之SVN

        本文链接:https://www.haomeiwen.com/subject/gyvwaxtx.html