在软件开发过程中,通常一个软件项目要靠多人合作完成的。而在此过程中的修修改改一定会存在一些不可避免的问题。可能一不小心就闹出个大乱子呢。
一、源代码管理的问题
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的注意点
- 如果使用到静态库必须使用命令行将静态库添加到svn的管理之下
svn add libRegex.a
- 如果使用到了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)为什么要用源代码管理工具?
答:能追踪一个项目从诞生到定案的过程、方便查阅特定版本的修订情况、检验开发人员是否合格。
- 请解释一下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讲解视频