版本控制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 常见图标

SVNIcon.png

  • 绿色对勾:和服务器关联成功,提交代码成功
  • 蓝色问号:服务器不知道有这个文件
  • 蓝色加号:计划将文件提交到版本库
  • 红色感叹号:代表文件被修改了,改动还没提交到版本库
  • 黄色感叹号:出现了冲突
  • 灰色对勾:文件只读--功能不稳定,工作里很少用
  • 小锁图标:文件被锁定 -- 功能不稳定,工作里很少用

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 版本的开发。

     

  •  

  • 这个目录结构可以让我们的项目管理更正规,但是在实际工作里由于这种方式太过复杂,很多公司都是建立空仓库

posted @ 2017-06-03 19:11  iFat  阅读(247)  评论(0编辑  收藏  举报