热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从SVN迁移至Gitlab+Gitflow总结

从SVN迁移至Gitlab+Gitflow总结转载请注明出处http:blog.csdn.netuxyheavenarticledetails50373076

从 SVN 迁移至 Gitlab + Gitflow 总结

转载请注明出处http://blog.csdn.net/uxyheaven/article/details/50373076

背景

之前在的公司一直都是用svn做源代码管理, 人少的时候也木有发现什么太大的弊端. 后来换了一个团队后, 业务发展速度实在是超乎想象.
短短的几个个月时间, 我们单语种的开发人员扩充到了10人以上, 接下来的两个月中, 人数要到20人. 我们的并行版本也是增加了好几个. 有的版本是由于特殊原因, 一直木有发版, 并行了几个月(代码也就是一直木有同步了…); 有的则是业务线的开的多, 就是需要同时开很多个分支, 一个分支一个版本, 在发版的时候在合并起来.

在这期间, 我们次次发版前的合并代码是一项艰巨的任务. 既然代码管理已经是个问题了, 那么就需要改了.

业务分层

业务层的代码只要不涉及到其他业务模块, 总是相对独立的.
我在刚来的时候先横一刀斩出了业务层. 从物理目录上隔离了业务模块代码和其它代码. 再竖几刀切出了各个业务模块. 虽然代码还是原来的代码, 不过最起码物理文件夹不一样了, 合并代码的时候再不济直接整个文件夹替换便是.

然而事实证明我是too young, too simple. 如果次次的代码变动只是业务层, 理论上也不会有啥冲突. 问题是出在我们的业务发展太迅速, 我们的业务代码以外的其它代码也是动不动就不能满足需求了, 需要随着业务代码的改变而改变. 这就导致了业务A为了满足自己的需求直接就改了其它代码成PPAP, 然后业务B为了满足自己的需求改了其它代码成PPBP, 嘛, 冲突就这么来了.

Gitflow

俗话说没有经历过业务高速发展的架构师都是扯淡. 很庆幸我们团队能有这次机会随着业务一起成长.

我们先来分析下问题所在:

  • 开发人员多
  • 并行开发的版本多
  • 底层代码一直在改

我决定采用 Gitflow工作流 去解决这次的问题.

Gitflow工作流通过为功能开发, 发布准备和维护分配独立的分支, 让发布迭代过程更流畅. 严格的分支模型也为大型项目提供了一些非常必要的结构.
Gitflow工作流没有用超出功能分支工作流的概念和命令, 而是为不同的分支分配一个很明确的角色, 并定义分支之间如何和什么时候进行交互.

gitglow0

主要分支:

  • Master(绿色): 永远处在 production-ready 状态
  • Develop(橙色): 最新的下次发布开发状态

支援性分支:

  • Feature(蓝色): 开发新功能都从 develop 分支出来,完成后 merge 回 develop
  • Release(黄色): 准备要 release 的版本,只修 bugs。从 develop 分支出来,完成后 merge 回 master 和 develop
  • Hotfix(灰色): 等不及 release 版本就必须马上修 master 赶上线的情况。会从 master 分支出来,完成后 merge 回 master 和 develop

工具方面, 我决定用SourceTree, 因为这个APP不仅自带官方汉化还自带gitflow, 学习成本很低.

先点击下Git工作流按钮(first blood), 初始化下环境. 这样就有了master 和 develop 两个分支. 还为功能分支, 发布分支, 补丁分支分别制定了前缀.

gitflow1

当需要开发一个新功能的时候. 切换到 develop 分支上, 接着还是点击 Git工作流按钮(double kill), 选择建立新的功能, 然后为功能起一个名称b. 这样本地分支目录下就会多了一个feature文件夹, 里面有一个b分支.

gitflow2

当这个功能b开发完成后, 还是点击Git工作流按钮(trible kill), 点完成当前版本.代码会自动合并到developer分支上, 并且可以选择删除当前的b分支.

gitflow3

当需要发布的时候, 切换到developer分支上, 点击Git工作流按钮(urltra kill), 选择建立新的发布版本1.2. 这样本地分支目录下就会多了一个release文件夹, 里面有一个1.2分支.
当1.2没问题后, 还是点击Git工作流按钮(rammpage), 点完成当前版本, 给当前版本打个tag. 代码会自动合并到master分时和developer分支上.

gitflow4

如果线上版本一步小心有了一个bug, 切换到master分支上, 还是点击Git工作流按钮, 点建立新的修复版本1.1.1. 完成后还是点击Git工作流按钮, 点完成当前版本, 给当前版本打个tag. 代码会自动合并到master分时和developer分支上.

gitflow5

这期间, 统一的入口点都是点击Git工作流按钮(这个按钮已经holy shit), 是不是很方便? 这也是为啥我建议大伙用客户端的原因. 可以不用手把手教了, 都是汉语的, 一看就懂了.

Gitlab

我们的代码之前是托管在公司的svn上, 现在是托管在公司司的gitlab上. 为啥用都用公司的呢, 1方便, 2公司禁止私建服务器, so怎么搭建的流程就直接跳过了.

具体的步骤是这样子:

  • 用户访问公司gitlab地址
  • master权限用户给其他用户添加添加权限
  • 用户安装git or git客户端
  • 用户添加ssh

gitlab的使用主要是一个权限问题, 虽然help里写的也很详细, 不过就是太详细了反而显的啰嗦. 我在这里把需用关注的一些权限总结如下:

项目权限

  • private 私有, 项目必须显式地为每个用户访问权授予。
  • internal 内部, 任何登录用户都可以克隆这个项目。
  • public 共有, 所有用户都可以看到这个项目

用户权限

  • guest 只能提issue
  • reporter 可以看文件, 不能上传任何修改
  • developer 可以看, 可以上传developer分支的修改, 可以建分支, 可以删远程分支. 不能上传master分支的修改
  • master 都可以

wiki权限

  • guest 只能看
  • reporter 只能看
  • developer 可以增改页面, 但是不能删除页面
  • master 可以增删改

我先是为我们团队建立了一个group, 然后默认所有人都是guest权限, 然后再单独为每个项目为相关的开发开通developer权限, 为部分开发开通了master权限, 让他们也可以自己分配自己的项目内的权限.

迁移

将旧代码迁移到新平台. 我先是给两个同事share了gitflow, 让他们了解到新的开发模式有哪些优点. 然后安排他们一个去研究Gitlab+Cocoapods(都换成git了, 肯定要上这货了), 一个去研究配套的jenkins.

当一切都研究的差不多的时候, 我让他俩在公司内部准备了一次share, 用于让公司各个业务线的负责人了解到现在存在哪些问题, 我们用怎样的方法去改善它, 我们最近弄出的东西到底是什么. 然后我在团队内部分享了gitflow, 用于让团队内部的开发GG了解我们接下来要怎么做.

接下来就是真正的迁移工作. 迁移的时候, 没得商量, 直接冻结了svn, 告知所有小伙伴禁止在svn上提交代码, 今后统一换成git.

至此这次的迁移工作就算是完成了. 在整套全新的持续集成环境落地的期间我们不是没有遇到问题, 反而是遇到了很多问题. 这里列出一些问题, 给诸位当做参考了.

问题

权限问题

master权限太大一不小心什么都删了. 如果只有个别开发配置master权限, 一般开发用developer权限的话, developer还是可以删除远程的feature.

解决

配置分支权限, 把重要的分支设置成保护的. 还可以设置成develpoer都不能push, 不过这个没啥必要.

合并冲突问题

两个feature建立了新文件后, 合并代码必冲突.
第一个完成的feature肯定没问题拉.
第二个完成的feature需要需要解决xcodeproj里的project的冲突才可以点完成.

解决

每天先把developer的代码往feature合并一次后, 再进行开发.

push merge问题

当一个feature开发完成后, 可以申请合并到developer里, 申请的同学可以自己点accept.

解决

developer分支设置成保护, 同时禁止developer分支的push.

依赖问题

当featureA和featureB都依赖一个底层的接口的时候, feature如何处理.

解决

先拉出featrueC写底层接口, 完成后, 在拉出featureA和featureB. 但这样的缺点是影响进度. 还可以featureA, featureB, featureC, 都拉出来, featureA和featureB先用挡板开发. 当featrueC开发完成后, 合并到develop上去, 然后把develop的代码合并到featureA, featureB上.

打包问题

业务线多的话feature也很多, 还经常改名字, 对应的jenkins需要经常配置.

解决

jenkins可以多配几个jobs

svn问题

代码在git上, 但是有些资源在svn上, 打包的时候需要下载下来, 暂时不知道怎么拉下来

解决

把那些资源丢到git上. 再没丢之前先用命令行拉, but小伙伴说木有拉下来…


推荐阅读
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
  • Objective C接入Sonar代码扫描
    目录技术方案环境准备扫描器配置项目配置SonarQube配置jenkins接入一些坑技术方案Sonar本身有对OC的代码扫描插件——SonarCFamily,但是是收费的。出于成本 ... [详细]
  • ios中级面试题(二)
    1.如何追踪app崩溃率,如何解决线上闪退当iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上。crash日志上有很多有用的信息,比如每个正在执行线程的 ... [详细]
  • 运行就报对我有效的解决方法是:把真机和模拟器需要的文件手动加入其中,具体请参考网络上提供的其他解决方 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 在真实开发中,因为需求是不断变化的,说不定什么时候就需要往模型里添加新的字段,添加新的模型,甚至是大规模的重构; ... [详细]
  • Maven入门、什么是Maven、如何使用Maven、Maven的项目结构、简单的Mavenjava项目、Maven常用命令、Maven项目之间的引用、Maven依赖的传递、可选、排除day01
    目录第一节Maven入门1.1什么是Maven1.2如何使用Maven第一步:下载Maven第二步:配置Maven的环境变量第三步:了解什 ... [详细]
  • linux编写弹球游戏,手把手教你开发一款基于Box2D的弹球游戏(一)
    今天我们来介绍一款物理引擎,并基于它完成一个弹球游戏。提到物理引擎,就是在游戏中模拟真实世界的运动,碰撞,摩擦等等。Coco ... [详细]
  • IvebeentryingforadayortwototryandgetashadowtodrawinsidethetextofanNSTextField ... [详细]
  • 1、前言在macOS下,如果对大量图片进行处理或数据收集,查找了一下,通过使用sips命令,可以进行图片的大部分操作处理,如果使用shell,就可以灵活和自动化的批量操作图片!2、 ... [详细]
author-avatar
CHEN--MIN--珊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有