首页 科技 电脑 手机 安卓 苹果 VR 站长 游戏

您的位置:咪哚网 > 站长资讯 > 建站 > 经验 >

经验分享|大型分布式团队的代码版本管理

咪哚网(www.midoo.cc)时间:2018-07-06 13:40 稿源:网络 手机扫描分享

不管团队最终选用什么代码版本管理工具,只要适合自己的团队的开发流程和工作方式,并且代码管理顺畅就可以了。

介绍这个话题,有两个原因:

从开始工作到现在,我经历过没有代码版本管理、代码集中式管理,以及现在的分布式管理,我深刻体会到它在软件开发过程中的重要性;我在工作中遇到的很多客户都存在对于代码版本管理的各种问题、困惑和不同的需求。

所以,我希望将我在这个方面的经验分享给更多人,希望能帮助更多的团队解决在代码版本控制方面的问题和疑惑。

一、代码版本管理系统的历史

代码版本管理系统大致可以分为三个时代:

第一代:本地式

这代主要的特点提供本地代码版本控制,比如SCCS(1972)、 PVCS(1985)等。

这代主要实现了基本的代码版本管理,但缺点是无法让多人同时对一个版本库进行修改。这个也和当时软件规模不够大有关,也没有这样的需求。

第二代:客户端-服务器式

这代主要的特点是提供集中式服务器端代码版本控制,比如 CVS(1986), ClearCase(1992), Visual SourceSafe(1994), Perforce(1995), Subversion(2000) 等。

这代主要是实现了中心服务器端的代码版本管理,特点是可以让多人同时对一个代码版本库进行同步和修改,但缺点也相当明显:

在无法连接服务器的情况下,无法查看日志以及提交和比较代码版本(慢速网络和远程异地工作的程序员的痛),以及当服务或者网络出现问题的时候很多人员就会无法工作。不支持local branch,导致branch创建管理复杂,并且一旦创建就很难修改(快速迭代开发中的程序员的痛)由于只有一个中心端服务器,一旦发生灾难性问题,那么所有日志都会丢失,所以需要经常做备份(备份需要不小的成本)如果软件代码量过于庞大,一般会出现速度缓慢的情况,因为每次的日志查询、不同版本之间的代码比较和代码提交等操作都需要和服务器通信,造成服务器端的负载过大。第三代:分布式

这代主要的特点是提供分布式代码版本控制,比如Git(2005), Mercurial(2005)等。

这代结合了第一代和第二代的优点并实现了分布式的代码版本管理。

这代的优点:分布式管理,在没有和服务器有连接的情况下仍然可以查看日志,提交代码,创建分支;支持local branch,可以快速方便的实现各种分支管理;支持分布式,从而可以实现分块管理,以及负载分流管理。

缺点是有一定的学习曲线,比如分布方式下的代码同步,local branch的理解与运用,分布式代码管理的理解与运用等。详细的比较可以参考:这里。

二、大型分布式团队

曾经有这样一个分布式团队,他们在多个城市都有小分队,并且正在开发一个大型项目,见下图:

他们使用的代码版本管理工具是第二代代码管理工具SVN,管理方案如下:

但是他们在使用的过程中却遇到了下面这些问题与痛点。

由于是分布式团队,所以:

基于团队的代码模块分离困难

当服务器不可用时:

不能查看提交记录不能比较文件不能提交代码

创建代码分支时:

分支创建速度慢多分支管理困难

在提交代码时:

希望有Code Review希望有CI Review

因为代码庞大:

查看日志慢

备份代码库的时候:

需要停机备份备份成本高

针对以上问题,可以使用新一代的分布式的代码版本管理系统来解决,见下图:

其中每一个团队都有自己独立的代码库,有一个中心库用于同步这些独立的代码库,并且每个库都由团队自己管理和维护。而且代码版本管理系统需要支持轻量分支,代码评审,离线提交,离线查看日志等功能。

但是由于当前没有一个单一的代码版本管理工具能同时满足以上所有需求,所以很多公司都基于它们开发集成管理系统,比如Gerrit,GitLab,GitHub,BitBucket等。其中的Gerrit由于其开源,免费,以及由Google开发和维护,并管理着Android,OpenStack等大型项目源代码的特点,成为了大型分布式团队优先选择的系统。

三、Gerrit

Gerrit是由Google开发的,用于管理Google Android项目源代码的一个系统。它是基于Java和Prolog等开发的,支持Git,权限管理,代码评审等综合的一个管理系统。它与GitLab和GitHub最大的不同是它隐藏了代码分库管理的细节,使得开发人员不需要进行fork这样的手工分库和同步操作就可以进行代码开发和提交,节省了开发人员的时间,见下图:

由于Android本身是一个开源项目,所以贡献者非常多,开发团队也遍布多个地方(存在时差),导致“如何保证代码质量”成为一个很大的问题。为此Google在Gerrit中加入了功能强大并且十分严格的代码评审系统。

首先当代码提交以后并不会直接merge到中心库里面,它会暂时存在一个临时库里面,同时生成一个代码评审记录,并向特定的评审人员发送请求评审的邮件。当评审者在评审代码之后,如果通过就需要在Gerrit系统里面对代码进行打分,如果通过了就可以将代码merge到中心库里面去,如果没有通过,那么这个代码提交就需要被返还给开发者进行修改。

与此同时它还可以自动触发一次包含本次代码提交的CI构建(前提需要手工预先配置),如果CI自动构建和测试通过,也可以自动在Gerrit系统里面进行打分,可以给最终进行merge的人员进行参考。示意流程见下图:

由于Android源代码由上百个独立的代码库组成,并且编译一个Android系统需要大部分代码库里面的代码,所以如何管理如此多的代码库也是一个难题,比如如何一次性同步需要编译一个需要支持特定设备的代码库组合。为此Google基于Python语言开发一个工具叫Repo ,这个工具可以自定义你需要的代码库的组合,并且一次性对这些代码库进行同步,比如pull和push,见下图:

四、SVN到Git的迁移

对于想从集中式代码管理系统迁移到分布式代码管理系统的团队来讲,如果团队规模小,那么问题一般都不大,但是对于大型分布式团队却是困难重重。最主要的两个困难:

代码量太大,很难一次性将所有的代码和日志等在短时间内迁移成功。由于下属团队太多,很难同一时间让所有团队都切换至新的代码管理工具。

为了解决这些难题,一般都会首先选用1个团队来使用新的代码版本管理工具。如果这个团队转换成功,再将其作为标杆向其他团队推广,从而逐步的将所有团队切换到新的工具上去。

SVN到Git的迁移方案一般主要会使用两种工具:

开源免费的git-svn;商业收费的Subgit。

其中使用Subgit的迁移方案,如下图:

如果团队组资源充足,还可以使用Gerrit搭建一个独立的Git服务器,从而以分布式的方式进行代码迁移,如下图:

五、多产品线的管理

编辑:未知

声明:
1、咪哚网所转载的稿件都会明确标注作者和来源,如您不希望被转载请及时与我们联系删除。
2、咪哚网的原创文章,请转载时务必注明文章作者和"来源:咪哚网",不尊重原创的行为咪哚网或将追究责任。
标签
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:看不清?点击更换
最新评论

科技 娱乐 健康 国内 生命 天文 自然 科学

微软善于听取来自用户、IT人员和开发者的各种想法

据外媒报道,微软CEO萨蒂亚·纳德拉日前在

乐视危局 张艺谋王宝强等上亿投资或遭变故

在深陷欠款危机,贾跃亭自曝乐视资金链紧张

霜降天气渐冷 推荐4款最佳食疗

我国古代将霜降分为三候:“一候豺乃祭兽;

外媒:大陆博物馆文物众多 但最好的宝贝在台湾

新西兰stuff网站11月20日文章,原题:对首

为您推荐RECOMMEND

最新资讯

     关于本站| 友情链接| 版权声明| 意见反馈| 不良信息举报| 联系我们| 网站导航

Copyright © 2016 咪哚网 版权所有.

MIDOO.CC, All Rights Reserved. 备案号:豫ICP备15012166号-2