首页 > 代码库 > 版本控制SVN
版本控制SVN
为什么需要版本控制软件
- 代码的冻结
- 避免在重大的考核之前改动代码
- 每个稳定版本都在服务器保存进度,随时可以回退
- 需求频繁的变化不要改动稳定的代码,不要改别人写好的代码
- 为什么需求会变化?有时候产品自己也是迷糊的,也不知道想要什么。频繁改动会导致工期长,不能按时交货。
- 破解方式:提前准备几套设计方案,跟需求方确定好要使用的版本,后期如果再改需求就加钱。
- 限制代码权限。
- 对代码分模块开发,每个人可以读取的模块不一样,有人可以处理Android端,有人可以处理iOS端,有人处理服务端数据库,有人处理服务器API,这样就没有人能一次性将公司的所以资源拿走
- 项目管理,工作量统计:
- 有个bug,找出来一行有影响的代码,注释掉后bug消失了,统计了一个bug;过两天发现由于注释掉的哪行代码引出了更多了bug,你偷偷摸摸的把代码又改回去,新 bug消失了,旧 bug 暂时还没测试出来,于是这两天就是把一行代码注释掉又还原,结果工作统计上算你解了两个bug。
- 常见的版本控制软件:
- cvs 已经过时,基本没人用了
- svn ,当前的版本控制主力,今天的主要学习内容
- git ,linux社区大神开发,正在逐渐变得流行,是目前最好的版本控制软件
虚拟机的安装
- 如果我们在真机里安装服务器,万一失败了不好处理。而虚拟机可以完整的模拟一台电脑,当虚拟机运行起来之后,相当于在在电脑里开了一个新电脑,如果发生错误,也不会影响真实电脑,比较适合用来做测试。避免错误的操作影响当前正在使用的系统。等挨虚拟环境使用熟练之后可以再到真机里安装软件。
- 创建虚拟机,安装操作系统
SVN 服务器的安装
- 直接拖拽安装文件到虚拟机
- 选择版本:企业版收费,标准版不收费,选择标准版
- 选择:软件安装、仓库位置、访问端口号,保持默认值
- 是否安装成功
- 在虚拟机验证:https://127.0.0.1:443 显示“Welcome to VisualSVN Server”
- 验证主机是否可以访问:设置虚拟机的ip为教室网段的固定地址(比如:192.168.1.254)
- 公司里也是一样的服务器,只是他们的服务器一般有一个公网的网址,可以在家里也访问
- 主机要想访问到虚拟机服务器,需要设置网络为
桥接网卡
,下面的硬件选择有线网卡
- 创建代码库安装客户端,关联客户端和代码库
- 创建新仓库 MobileSafe
- 选择仓库类型:空仓库
- 选择权限:自定义。并创建两个新用户,一个班主任的名字可读可写;一个肖学升是老板,只可读
SVN 客户端的安装
- 在新建的虚拟机上安装客户端 TortoiseSVN
- 安装时一定要勾选:command line client tools
- 是否安装成功;
- 在桌面上点击右键,显示 SVN 相关的菜单
单用户代码的控制
关联代码仓库
- 客户端创建文件夹来存放代码
- 从服务端右键复制仓库地址
- 在客户端菜单选择 SVN Checkout,将服务器的主机名换成 服务器的 IP 地址
- 确认检出,并接受权限验证,输入班主任账号密码,成功后将具备可读写的权限
- 是否已经关联:
- 设置文件夹选项,显示所有文件和文件夹
- 在代码文件夹下有一个 .svn 文件夹
- 还可以发现当前文件夹有一个绿色对勾的标识。如果看不到可以刷新一下。还是看不到可以重启电脑或重启资源管理器。
上传代码
- 客户端新建一个文件(比如 mobilesafe.txt),刷新可以看到一个
蓝色问号
,标识这个文件表示服务器没有这个文件。在文件上点击右键,选择SVN - > add,文件图标变成蓝色加号
,表示这个文件可以被上传到服务器- 修改文件内容 ,简单的 hello world 代码
- 再次在文件上点击右键,可以看到多了一个 Commit 选项,点击可以提交文件到服务器。
- 输入提交日志:小子们,姑奶奶的第一份代码提交了
- 下方的文件夹列表有要提交的文件
- 点击提交,输入用户名和密码。
这里可以点击保存密码,就不需要重复输入了。
- 文件提交后,图标变成
绿色对勾
的标识,表示该文件和服务器的版本一样 - 是否提交成功:刷新服务器仓库,可以看到新文件
修改代码
- 在 mobilesafe.java 文件增加一行代码,图标变为
红色感叹号
,表示代码和服务器不一致。 - 在文件上右键看到有 update 和 commit。update 用于在多人合作的开发,待会练习多人操作时再用。
- 下方的文件列表里,双击可以看到变化的代码行
- 继续使用 commit 提交代码,输入提交日志:姑奶奶又来提交代码了,好像已经很顺手了呢。
查看历史日志信息
- 在文件上点击右键,SVN - > show log
- 选中任意版本历史,可以看到被修改的文件,双击文件可以看到被修改的代码
- 在文件上点击右键,选择 save revertion to -> 可以将该版本的文件导出。查看导出的文件可以看到原先的代码。
从服务器重新同步代码
- 班主任毕竟是是个新手,某天电脑中毒,重装了系统,代码全部丢失,需要将代码找回来
- 将客户端代码全部删除。
- 因为代码在服务器上,只要重新关联服务器,就能拿到所有的的代码
- 新建文件夹,并再次 checkout 代码,可以看到获取到了最新的代码。
验证权限控制功能
- 在虚拟机新建文件夹2,使用肖学升的账号同步代码,肖学升作为不懂代码的老板,只要看看就行了,不要改动代码checkout 服务器代码,并使用肖学升的账号和密码
- 由于之前已经记录了班主任的账号密码,需要清除账号才能使用新账号
- 桌面上点击右键 --> SVN --> Settings --> Save Data --> 将所有数据都 clear
- 修改代码,可以看到代码变为
红色感叹号
,也就是文件和服务器不一致。 - 点击右键选择 commit ,随便输入日志或者不输入都可以,点击提交,可以看到出现红色错误提示提交失败。
Commit Failed( details follow;Post of ‘path‘ :403 Forbidden)
- 这就是因为肖学升没有写权限
以上就是单用户的时候的版本控制方法
版本库的备份和还原
- 如果服务器也要重装系统,就需要将服务器数据备份,当重装后还原数据
- 查看服务器数据 c:/responestor。将 MobilePlayer 文件夹复制出来,那就是备份文件
- 删除服务器仓库,相当于服务器重装了
- 在服务器的 Repositories 点右键 --> 所有任务 --> import Existing Respository,选择刚刚备份的服务器数据,点击确定后可以看到服务器数据被重新找回
多用户代码的控制
仓库初始化
- 新建仓库 MobilePlayer2,添加班主任和肖学升,都是可读可写权限
多用户的代码初始化
- 在真机上创建文件夹 workspace ,checkout 一份源码,使用肖学升账号登陆并保存密码,出现 .svn 文件夹说明关联成功
- 创建一个 MobileSafe.java 文件,写入伪代码,表示这个一个作为引导界面的类。此时显示为蓝色问好。
- add 到版本库,此时显示为蓝色加号
- commit 到服务器,日志信息为:肖学升初始化了引导界面。此时显示为绿色对勾。
- 在用户虚拟机上创建 workspace 文件夹,checkout 源码,并使用班主任的账号密码。
- 可以看到检出代码成功后出现了 .svn 文件夹和 MobileSafe.java 文件,打开文件可以看到就是最新的源码内容
正常的多用户代码更新
- 在主机上修改文件,日志信息为:肖学升更换了引导页图片。并提交到服务器
- 在虚拟机上获取最新代码,在源码文件夹里点右键,选择 update。可以看到最新的代码
- 虚拟机上修改代码,并提交
- 主机上更新代码,可以看到最新代码
多用户代码的冲突方式1
- 主机上再次修改文件,并提交到服务器
- 虚拟机上不更新文件,而是修改并提交文件。此时会出现
out of date ,you have to update your working copy first
的错误,也就是说文件过时无法提交文件。工作里出现代码冲突是很讨厌的的事,但是很难完全避免,如果想要尽量减少冲突只能是经常更新到最新的代码
- 点击 OK 之后,自动提示需要更新 ,点击 update。提示有文件冲突
- 再看文件夹,文件图标变成了
黄色感叹号
,同时出现了三个不同后缀的文件 - 打开源码文件,可以看到有先前肖学升的代码,也有班主任的代码
- 由于同一行代码被两个人一起修改,版本控制系统不知道应该记录谁的版本,因此产生了冲突。
- 解决方法是:在文件上右键 --> SVN --> Edit conflicts。弹出来的对话框可以看到有冲突的代码。
- 界面有三个部分,一个是服务器的代码,一个是本地提交的代码,一个是合并后的代码预览。
- 合并窗口里显示为问号的就是有冲突的代码
- 在服务器代码或者本地代码上点右键可以选择
Use this text block
,看到合并窗口里问号变为选择的代码。-- 为了能完整的操作练习,这里选择使用本地的代码。 - 此时冲突不存在了,可以点击保存,关闭窗口
- 此时代码文件夹里那三个不同后缀的文件就不存在了
- 查看代码文件只有最新代码,再 commit 可以正常提交代码到服务器
多用户代码的冲突方式2
- 主机里更新到最新的代码,然后修改代码,并提交
- 虚拟机里不更新代码,就直接修改,并提交
- 再次出现冲突,update 代码,出现三个处理冲突的临时文件
- 在冲突文件上点击右键 --> SVN --> reslover --> 系统自动进行代码合并,处理冲突的三个临时文件消失
- 打开源码文件可以看到冲突的代码,手动编辑,只保留需要的代码
- 此时认为代码已经合并,可以直接 commit 新代码到服务器
- 公司里减少冲突的解决办法:
多个员工分模块开发,减少修改同一个文件的可能性。
SVN 常见图标
- 绿色对勾:和服务器关联成功,提交代码成功
- 蓝色问号:服务器不知道有这个文件
- 蓝色加号:计划将文件提交到版本库
- 红色感叹号:代表文件被修改了,改动还没提交到版本库
- 黄色感叹号:出现了冲突
- 灰色对勾:文件只读--功能不稳定,工作里很少用
- 小锁图标:文件被锁定 -- 功能不稳定,工作里很少用
SVN 提交代码的原则
- 先更新再提交
- 多提交
- 不要提交编译不通过的代码
- 每次提交要写明清晰的注释
- 不要提交自动生成的文件 -- 一会处理Android代码时演示
- 分模块开发,尽量不要改动别人模块的代码。
- 慎用锁的功能
使用 SVN 管理 Android 项目
- 在服务器新建版本库 AndroidTest,用户肖学升和班主任有读写权限
- 在真机上使用 Eclipse 新建 Android 工程
- 关联普通文件夹的步骤:新建文件夹并右键 Checkout。生成了.svn 文件夹说明关联成功
- 关联 Android 项目:将文件添加到版本库:选中 .svn 以外的所有文件,右键 --> SVN -->Add。可以看所有文件都变成了蓝色加号
- 将普通文件夹的 .svn 文件夹复制到项目的文件夹下。可以看到所有的文件都变成了蓝色问号
- 也可以直接在项目文件夹里 checkout
- 提交代码到版本库:选中 .svn 以外的所有文件,右键 --> SVN --> commit 。可以看到所有文件变成了绿色对勾
- 刷新服务器的文件夹,可以看到提交的代码
- 打开 MainActivity 并在 onCreate 方法打印方法名。打开项目文件夹,可以看到 bin 和 src 目录都变成红色感叹号,也就是都发生了变化。
- 提交变化的代码,选中两个红色目录并右键 commit。图标变成绿色对勾。查看 log 可以看到提交信息。选中最新的提交,可以看到变化了 src 下的 MainActivity.java 和 bin 下的 MainActiivity.class,bin 目录下的变动是自动生成的,并且提交到版本库也没法看出变更了什么。所以,
自动生成的数据不需要添加到版本库。
- 忽略掉不需要提交的文件,选中文件后点击右键 --> SVN --> Unversion and add to igonre list --> Delete and ignore 2 items by name;更新项目并提交,让服务器知道这两个文件不需要进行版本管理
- 再修改 MainActivity 代码,可以看到只有 src 文件夹变成红色
- 现在是每次改代码都要打开文件夹,再提交代码,比较繁琐,待会可以使用Android Studio来进行操作。
SVN 的标准目录结构
查看 PPT 里 Trunk、Branches、Tags 的简单介绍
在服务器新建版本库
- 选择类型的时候使用带有 trunk、branch、tags 的版本库。
- 其他设置和之前一样。可以看到创建的版本库自带了以上三个文件夹。
查看 PPT:版本控制项目实例 -- 沫沫
新建开发项目
在真机新建 momo 文件夹存放沫沫的源码,checkout 关联版本库服务器 truck 文件夹
创建 momo.java,写一些伪代码
java if(点击按钮) sout("给你一个好友,聊天去吧");
- 右键 add 到版本库,并 commit,日志信息为 :1.0 功能开发完成,功能已经稳定
设置里程碑
- 在文件夹里右键 --> SVN -->Repo-Browser。打开的窗口 可以看到和服务器相同的目录结构
- 选择 trunk ,右键选择 copy to,文件路径指定为 tags/1.0 文件夹。记录日志为:1.0 里程碑,聊天功能稳定
增加了一个大功能,再次创建里程碑
从 1.0 版本跳跃到 1.3,由于内部测试里 1.2 版本只是修复 bug 没有亮点,导致没有发布,1.3 版本出现了摇一摇是个大功能,才发布了新版本
修改代码
```java // 原有代码
// 新代码 if(摇一摇) sout("摇出来一个好友,聊天去吧") ```
提交代码,日志为:摇一摇功能开发完成了
项目文件夹里点击右键 --> SVN --> Browser。打开的窗口选择 trunk 文件夹,右键选择 copy to,文件路径设置为 tags/1.3。注释为 1.3 里程碑,摇一摇功能代码已稳定
开发过程中的bug修复
由于摇一摇版本大获成功,公司老板拿到了一大笔钱,给所有员工发了十万块钱,给了一个月假,让各位放松放松。
结果正在去泰国的飞机上的时候,老板打来电话,紧急召所有人员归位。因为之前开发的时候,判断条件是点击按钮就给推荐好友,没有区分性别,结果会出现同性的好友推荐。现在由于在英国的软件审核十分严格,导致摇一摇的版本不能上线,都在使用1.0版本,现在统计发现全都是gay,需要在 1.0 版本的判断条件上添加性别处理。
从服务器复制 tags/1.0 的路径,在虚拟机里新建 momo 文件夹,检出服务器 1.0 版本的代码
修改代码
java if(点击按钮 判断性别) sout("给你一个好友,聊天去吧")
右键提交代码。可以看到提交的地址是 tags 目录。确定提交的时候出现警告,
提交代码时需要在一个 branch 或者 trunk 上才行。
删除错误的目录
在真机的初始代码里点击右键 --> SVN -->Repo-Browser;右键 tags/ 1.0 选择 copy to,路径为 branch/1.0
从服务器复制 branch/1.0 的路径;在虚拟机里新建 momo 文件夹,并 checkout 该分支的代码
同样的修改代码后提交。可以正常提交,也就是在 分支 1.0 上做了一个bug 修复
公司开发 1.4 版本,增加了新功能,并希望将之前修复bug 的代码合并进来
- 修改真机项目的源码
- if(你随便想一个名字) sout("你们已经成为好友了")
- 项目文件夹里点击右键,选择 merge。选择合并的路径为 branch/1.0 。确定进行合并。合并成功后打开源码文件,可以看到 性别判断 的代码被合并进来了。
- 此时再提交代码到服务器就完成了 1.4 版本的开发。
这个目录结构可以让我们的项目管理更正规,但是在实际工作里由于这种方式太过复杂,很多公司都是建立空仓库
版本控制SVN