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

2018-05-02 11:01:28 浏览数 (1)

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

一、源代码管理的问题

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无法对第二人的代码进行管理。

创建一个新的类

代码语言:javascript复制
cd code

touch person.h persion.m 

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

svn update

3)命令行的简写

代码语言:javascript复制
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

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

代码语言:javascript复制
svn merge -r新版本:要回退的版本 文件名

svn merge -r7:6 persion.h

最后提交代码到服务器上

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

5)删除文件

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

代码语言:javascript复制
svn remove 文件名

svn rm person.m

svn ci -m "删除了person.m"

6)查看版本信息

代码语言:javascript复制
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告诉服务器已经解决好冲突

代码语言:javascript复制
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

0 人点赞