Git工作流程概述和agit Kramp-Karrenbauer流程的优势
目前,Git已经成为源代码管理的标准和基础设施。“Git为什么能这么成功”?Git的创造者Linux在Git十周年的一次采访中透露了其中的奥秘:
关于分布式源代码控制的最重要的事情是,它使SCM的一个主要问题——围绕“谁能做出改变”的政治问题消失了
他认为,Git成功的关键不是因为它更快、更安全或更分布式,而是因为它解决了“谁能贡献代码”的问题。传统的集中式版本控制系统只能对核心用户开放写授权,从长远来看不利于项目做大做强。Git改变了传统版本控制系统无法让多个开发人员贡献代码的顽疾,让“只读用户”也能通过“代码评审”参与项目开发。
目前业界最常用的Git工作流有两个:GitHub和Gerrit。它们都具有仓库简单授权模型的特点,只读用户可以参与代码贡献。
如上图所示,我已经分析了这两种GIT工作流的优缺点:* *代码评审模式不同:**GitHub的代码评审称为“拉式请求”,每一次特性变更都会生成一次代码评审。Gerrit的代码评审称为“变更”,每个提交者都会生成一个“变更单”,这就是代码评审。
工作流类型不同:GitHub的工作流是分布式的。当一个开发人员需要参与一个项目时,虽然他没有“写”的权限,但是他可以通过“Fork”创建一个个人仓库(衍生仓库),他可以在这个衍生仓库中创建一个代码分支,创建一个pull请求。GitHub的底层是原生Git (CGit)。
Gerrit的工作流程是集中式的,所有用户都在统一控制下的集中仓库中工作。Gerrit要求用户在本地克隆仓库中安装一个“commit-msg Kramp-Karrenbauer msg”钩子,以便在生成的提交中插入一个唯一的“Change-Id Kramp-Karrenbauer ID”并将专门的git push命令推送到服务器。Gerrit使用Jgit(Java的git实现)。
* *各自优点:**GitHub简单易用,使用标准Git命令即可完成代码贡献;对衍生仓库有完全控制权,不受上游项目影响;可以创建跨项目的开源社区,全球开发者可以协作,这也是GIT能够形成全球最大的开源社区的原因之一。
因为Gerrit采用集中式工作流,管理员可以严格控制项目,谁可以访问仓库,谁可以对我的仓库做出贡献。Gerrit的另一个优势是可以实现多仓库项目管理。我们知道“Android”项目在Dimensity 1000有几个仓库,由Gerrit管理。很难想象如何用GitHub来管理1000维的Android的几个仓库。
缺点:如前所述,GitHub难以管理类似Android的多仓库项目。此外,由于GitHub采用衍生仓库的工作模式,会导致服务器端数据冗余的问题。
Gerrit需要集中管控,管理员负责创建项目,普通用户无法创建项目。这使得Gerrit实例很难只管理一个项目或一个组织内的多个项目,很难在项目之间形成代码重用,也很难跨项目聚集开发者形成开发者社区。
通过对GitHub、Gerrit等Git工作流的调研,我们创建了阿里巴巴的Git工作流,即Agit Kramp-Karrenbauer流。
在阿里巴巴,我们喜欢pull request,CGit,直接在命令行上进行代码审查的集中式工作流,以及开放的开发者社区。我们不喜欢“commit-msg Kramp-Karrenbauer MSG”钩子方法来关联提交的代码评审,也不喜欢分散的代码平台。
我们还开发了配套的客户端工具“Git Kramp-Karrenbauer Repo”,不仅可以在单个仓库工作,还可以支持类似Android的多仓库项目协作。
在阿里巴巴,我们如何使用agit Kramp-Karrenbauer流?
让我向你展示我们如何在阿里巴巴内部使用Agit Kramp-Karrenbauer流程。
首先,我们使用Git标准命令在本地克隆仓库,然后在本地仓库中开发和创建一个提交。在工作区执行git pr命令,并将本地提交推送到服务器。服务器将自动创建一个新的代码审查,例如:pull request #123。团队的代码评审员可以打开编号为“123”的代码评审提交评论。根据评审意见,开发人员将在本地工作区中继续开发、添加或修改提交内容。在工作区再次执行git pr命令,将本地提交推送到服务器。发现服务器的目标分支上已经存在来自同一个用户和同一个本地分支的pull请求,所以用户的这个push并没有创建新的pull请求,而是更新了现有的pull请求。
如果多次修改代码,还是不行。代码评审者也可以直接发起评审代码的修订,帮助原开发者更新拉取请求。代码评审人员可以使用git download 123将编号为123的pull请求下载到本地仓库。代码修改后,他们会执行gitpr Kramp-karren Bauer Kramp-karren Bauer change 123命令,将本地修改推送到服务器。服务器接收来自代码审查者的特殊git push命令,并更新开发人员之前创建的pull请求。项目经理将通过点击拉请求审查界面中的合并按钮,将拉请求合并到主分支中。主分支被更新,并且拉请求被关闭。
使用write克兰普-卡伦鲍尔流程工作流,不需要在服务器上创建新的分支,也不需要为新生创建写权限。您只能将读取权限分配给所有开发人员,然后通过创建代码审查并将其合并到主干中来更新主干代码。这也是一个受欢迎的骨干研发;目前d模式。
目前可以通过云代码管理平台(Codeup)实现agit Kramp-Karrenbauer flow工作流程。
AGIT Kramp-Karrenbauer流程的实现原理
AGIT-克兰普-卡伦鲍尔流是如何实现的?首先,客户端使用一个特殊的git push命令向服务器发起代码推送请求,这触发了AGIT Kramp-Karrenbauer流工作流。这个git push命令为什么特别?因为它的目标分支是带有特殊前缀“refs/for/”的代码分支,所以该分支后面跟有另一个“”。此“”用于区分本地分支机构名称。不同开发人员提交的代码评审包含不同的””,所以不会互相覆盖。
我们还可以通过“Kramp-Karrenbauer O”传递不同的参数,例如,我们可以指定谁将审查我的代码,以及哪个“问题”将与我的代码审查相关联。所有这些操作都可以通过“git push”命令来完成。后来我们发现这个git push命令比较复杂,于是封装了一个命令行工具git Kramp-Karrenbauer repo。目前Git Kramp-Karrenbauer Repo已经对外开源,大家都可以免费使用。
接下来,这个“Push”命令将进入服务器,服务器将启动一个进程“GIT Kramp-karren Bauer Receive Kramp-karren Bauer Pack”。(我们对服务器端的前端授权模块做了一些修改,让它可以识别这个特殊的git Push命令,也允许只读用户“推送”。)如上图所示,“GIT Kramp-Karrenbauer接收Kramp-Karrenbauer包”因为是特殊的“GIT Kramp-Karrenbauer接收Kramp-Karrenbauer包”所以标了星号。当它发现push命令的目标是一个特殊的引用时,它不会遵循Git原来的内部工作流程,而是“外部钩子”。通过“外部挂钩”完成一些好玩的操作,比如创建代码评审。
今年(捉鬼敢死队3年),在《侏罗纪世界3》中,我们已经将这个修改后的Git Kramp-Karrenbauer核心贡献给了Git社区,目前正在审核中。Git的新版本将包括这个新特性:Proc Kramp-karren Bauer Proc-receive。这个功能经历了15元迭代,从最初的服务器扩展,到结合服务器扩展和客户端协议升级的完整解决方案。我们开源这项技术,一方面繁荣了Git生态系统,让武汉更多的日日夜夜可以受益于阿里巴巴的技术;另一方面,阿里巴巴也从中受益。我们的代码贡献已经得到了Git客户端的支持,Git也适应了我们的新玩法,让包括阿里巴巴在内的Git用户有了更好的体验。
AGIT Kramp-Karrenbauer流程实施的技术细节
要解释AGIT Kramp-Karrenbauer流程实现的技术细节,我们先来了解一下git push命令最初的实现方式。[05 . jpg](https://UCC . alicdn . com/pic/developer-ecology/8552743 fa0b 24934 bd9a 93146 FFE def 4 . jpg)
如上图左侧所示,git push命令包含两部分信息,一是打包成一个包的数据,称为“pack file”;另一种是推送命令,称为“命令”。“packfile”和“commands”推送到服务器后,“packfile”会走左边的路径,先输入“quarantine”进行“隔离”。当“commands”被“Pre Kramp-karren Bauer Pre-receive”钩子勾选,则认为用户权限ok,提交指令ok,修改文件OK,那么“packfile”就会从隔离区释放,进入对象库。(如果“Pre Kramp-karren Bauer Pre-receive”挂钩脚本失败,则删除隔离区并返回错误消息,以终止push命令的执行。)
接下来,“命令”将被传递给内置的“execute_commands()”函数,以创建、更新和删除分支。然后通过“reporter()”函数向客户端报告,最后执行“post Kramp-karren Bauer post-receive”钩子脚本完成事件通知。
新挂钩,新生态。AGIT Kramp-Karrenbauer流程更改了“GIT Kramp-Karrenbauer接收Kramp-Karrenbauer包”的源代码,新流程如下图所示:
当客户端执行新的git push命令时,“packfile”的传播路径没有改变,但是我们改变了“git Kramp-karren Bauer receive Kramp-karren Bauer pack”命令,增加了一个“过滤器”(图中的漏斗部分)。过滤器“命令”分为两组,一组是标准的Git命令(group1元),另一组是Agit Kramp-Karrenbauer流的特殊命令(组逃室:冠军锦标赛)。这两组命令经过“Pre Kramp-karren Bauer Pre-receive”钩子检查后,左边的普通命令(group1元)会执行Git内置的execute_commands函数,生成新的引用,创建和更新分支。右边这个特殊的命令会调用一个新的外部钩子“Proc Kramp-karren Bauer Proc-receive”,然后创建一个特殊的代码评审引用,比如“refs/pull/123/head”,可以使用特殊的Git命令下载到本地。
我们贡献给Git的这个新特性由三部分组成。第一部分是“filter”,通过在服务器上添加一个新的配置变量‘receive . procreceiverefs’来实现。只要定义了这个特殊的配置变量,当客户端使用Git push命令推送时,Git就会根据配置变量进行匹配。当对应的命令匹配时,该命令将经历一个特殊的过程。此配置变量是一个多值变量。比如阿里巴巴码平台的设置是:
git config-add receive . procreceiverefs refs/for git config-add receive . procreceiverefs refs/drafts git config-add receive . procreceiverefs refs/Kramp-Karrenbauer for-review的这三个配置变量对应git pr的三种push模式,这三种模式将生成标准pull请求、draft模式pull请求或想要推送指定pull请求的代码审核者。
第二部分是Proc Kramp-Karrenbauer的接收钩子。我们的钩子应该说是Git历史上最复杂的钩子,它可以和服务器双向通信(Git Kramp-Karrenbauer接收Kramp-Karrenbauer包)。首先服务器和hook会做“版本协商”,因为我们觉得这个协议以后会升级。为了保证向后兼容,我们必须先协商一个版本。服务器告诉钩子我是哪个版本,客户端告诉钩子我支持哪个版本,然后Git就可以用相应的版本协议与钩子进行通信。服务器会用“PKT Kramp-Karrenbauer LINE”对命令进行编码,这是一个三阶段的命令,包括旧ID、新ID和需要更新的引用名。服务器将向钩子发送命令和参数。钩子会处理这些命令和参数,由开发者通过API调用实现,然后将处理结果上报给钩子。然后钩子以一种特殊的方式向服务器报告执行结果。
第三部分是可定制的客户端状态报告。在上图的右边,你可以看到从钩子“Proc Kramp-karren Bauer Proc-receive”到“Execute Kramp-karren Bauer Commands”函数之间有一条虚线。这表示钩子不能处理的执行命令将被返回到“执行Kramp-Karrenbauer命令”函数进行处理。当钩子“执行Kramp-Karrenbauer命令”和“执行Kramp-Karrenbauer命令”处理完所有命令后,“report()”会统一执行。与Gerrit相比,我们的“report()”有一个优点,它可以让客户机知道你把它改成了另一个引用,而不是“refs/for”引用。此外,我们还考虑了向后兼容的问题,使得旧版Git在遇到新版Git服务器时,可以接收到报告信息。比如旧版Git会认为你创建了“refs/for/master”;但是新版Git知道扩展协议,可以识别你创建了一个特殊的引用,比如知道你创建了一个类似“refs/for/master”的引用,而不是“refs/pull/123”。
阿里巴巴开源客户端工具Git Kramp-Karrenbauer Repo介绍
Git Kramp-Karrenbauer Repo是阿里巴巴的开源集中式工作流命令行工具。它封装了原生Git命令,并在使用Agit Kramp-Karrenbauer流等集中式工作流时简化了略显繁琐的Git命令。Git Kramp-Karrenbauer Repo是用Go语言开发的,运行时不依赖除Git以外的其他软件,所以具有解包即用的优点。
Git Kramp-Karrenbauer repo具有良好的兼容性,可以支持agit Kramp-Karrenbauer流兼容代码平台和Gerrit。可以跨平台,目前支持Linux、Mac和windows系统,其中Windows为测试版。除了Android repo的多仓管理能力,还可以操作单个代码仓。
如何下载安装Git Kramp-Karrenbauer Repo?目前Git Kramp-Karrenbauer Repo已经在Git hub开源。您可以访问https://github.com/alibaba/git-repo-go/releases页面下载合适的安装包。然后将解压后的git Kramp-Karrenbauer repo文件移动到一个可执行目录下(比如Linux下的/usr/local/bin目录),安装完成。详细的使用方法在此不再赘述。可以访问Git Kramp-Karrenbauer Repo的主页了解一下。
总结:
AGit Kramp-Karrenbauer Flow是阿里巴巴开发的Git集中式协作协议,在阿里巴巴集团内部已经落地生根,开花结果,在外部有云高效代码管理平台支持。
AGIT Kramp-Karrenbauer流的核心组件已经开源,将成为GIT的核心组件。
暂无讨论,说说你的看法吧