云效Codeup代码评审中的代码协同

简介: 云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。

640.jpg

大神说:“Show me the code”,于是就有了代码评审。

“Talk is cheap. Show me the code.”

 

——Linus Torvalds, founder of Linux and Git.

 

代码评审中同样存在着“Talk is cheap. Show me the code”,语言无力时,直接上代码吧。这就是我们今天要讨论的话题——代码评审中的代码协同。
一  基于邮件列表的代码评审
这是一种和代码仓库松耦合的代码评审模式,100%的代码都要经由一位或多位“仁慈的独裁者”(benevolent dictator)代码评审后才能合并入代码仓库。这种开发模式还需要开发者掌握一些命令行操作技巧以便完成代码在仓库和邮件列表之间的转换。采用这个模式的项目不多,不过 Linux、Git 开源社区就是按照这种模式运作的。
1  代码和邮件的相互转换
代码转换为电子邮件,要使用 git format-patch 命令。例如下面的命令将指定范围的代码提交(例如在 origin/master 之后的新提交)转换为电子邮件:

git format-patch origin/master..HEAD

 

生成的补丁文件的格式如下所示:

From: Author Name <author@email>
Subject: [PATCH] first line of commit messagemore commit message...
---diff --git ...
<content of patch>

 

  • 邮件头中的 Subject: 字段是邮件标题,使用 [PATCH] 作为标题前缀,以提交说明的第一行作为标题内容。

 

  • 更多的提交说明作为邮件内容,和邮件头之间用一个空行分隔开。

 

  • 用分隔符 --- 作为提交说明的结束。

 

  • 在分隔符 --- 和 diff --git 开始的补丁内容之间的文字被忽略。通常此处内容是提交的变更统计,开发者也可以在此处写入不宜列入提交说明中的附加说明。

 

git format-patch 命令有很多参数,要结合不同场景使用,例如:

  • 一个特性由多个提交构成,分散在多个提交中的提交说明难以描述整个特性,可以使用 --cover-letter 参数,生成一封编号为 0000 的邮件,作为后续提交的摘要说明,便于评审者理解代码。

 

  • 一个特性通常会多次迭代,就需要为每次迭代设置不同的版本。这就要用到 -v {num} 参数指定补丁的版本。版本将体现在邮件标题中,例如第二版本的补丁,邮件标题将使用 [PATCH v2] 作为前缀。

 

  • 回复特定邮件,以便形成可追踪的邮件线索,使用参数 --in-reply-to="{Message-ID}",为电子邮件生成相关的 In-Reply-To: 和 References: 头信息。

 

  • 默认提交本身的作者、提交说明的签名区(trailer)提及的贡献者会自动添加为邮件的收件人。要添加更多参与者,可以使用 --to={email}、--cc={email} 参数。

 

将电子邮件转换为代码,则使用命令 git am [options...] mail... 。该命令会将邮件正确转换为 Git 仓库中的提交。
使用 git send-email 命令,将包含代码提交的邮件发送到邮件列表。
2  评审中的代码片段转换为提交
代码评审以邮件回复的方式完成。注意邮件回复都要求用纯文本格式,否则会被邮件服务器退信。
代码评审中发现小的文字错误,例如将 warning 写成了 waring,评审者可能做出如下简洁的回复:

s/waring/warning/

 

这种约定俗成的格式大概是源于 sed 命令实现文本替换的语法。

评审者有时候会在回复中贴上大段的代码补丁,为了使代码补丁和邮件上下文做出区分,会使用特殊的剪刀分隔符将邮件中的评论和代码补丁分隔开。

Subject: Re: whatever thread you're inSomebody else said:
> blah blah blahI disagree. You should do it like this instead:-- >8 --
first line of commit messagemore commit message
---diff --git ...

 

上面是 Peff(Jeff King)在邮件中给出的一个示范,看到其中的剪刀分隔符了么?剪刀分隔符由多个减号(穿孔的分割线)和一个剪刀符号组成至少8个字符的分隔符。可选的分隔符有:-- 8< -- 、-- >8 -- 、-- %< -- 或 --- >% --- 等。

使用 git am --scissors 命令,能够识别邮件中的剪刀分隔符,将邮件中的代码转换为提交。
3  为提交贡献者署名
Git的提交元信息中只包含两个署名信息,一个是提交的原始作者(Author),一个是将提交合入仓库或者对提交做了修补的提交者(Committer),而在提交评审过程中有过贡献的人往往不只两人,如何致敬贡献者呢?Git 社区的实践是在提交尾部(trailer)添加贡献者签名。贡献者签名由一个被动语态的关键字和贡献者ID组成,例如:

  • Signed-off-by: User <Email> :通常由代码的贡献者(Author)和代码合入时的提交者(Committer)提供的签名。可由命令 git commit -s 、 git am -s 等命令自动添加。

 

  • Reported-by: User <Email> :问题的报告者。

 

  • Helped-by: User <Email>:对提交有过帮助的人。

 

  • Reviewed-by: User <Email> :评审者。

可以通过 Git 项目仓库的提交历史,看到更多的签名示例。
4  使用 GitHub PR 实现代码到邮件的转换
一个名为 GitGitGadget 工具借助 GitHub 强大的扩展能力,通过向 gitgitgadget/git 仓库发送 pull request,实现提交到邮件的转换,并发送到 Git 项目的邮件列表中。使用 GitGitGadget 参与 Git 社区代码贡献详见。
二  GitHub 代码评审中的协同
GitHub 使用 pull request 进行代码评审,评论中的代码块儿也可以转换为提交。
1  代码评论中嵌入代码块
下图中,点击评论工具栏第一个按钮,可以在评论中嵌入代码块:

 

2.png

2  评论中代码块转换为提交
对 pull request 的源仓库具有写权限的用户,可以将评审中的代码库转换为提交,如下图所示:

3.png

 

于是代码评审中会增加一个新的修正提交。
GitHub 的这个功能对于代码评审中发现的一些小问题,还是非常方便的。但是大的修改就无能为力了。

3  线下评审
对于功能复杂的 pull request,在线上浏览代码不方便,也不能线上调试代码,这时线下获取并浏览代码,就非常有必要了。
GitHub 的代码仓库中为每一个代码评审设置了特殊的关联引用:

  • refs/pull/{ID}/head :关联 pull request 的源提交。

 

  • refs/pull/{ID}/merge :对于没有冲突的 pull request,这个引用指向一个成功的合并提交。

 

代码评审者使用如下命令可以获取 pull request (例如编号为 123 的 PR)指向的提交:

git fetch origin refs/pull/123/head
git switch -d FETCH_HEAD

 

评审者可以线下调试 pull request 指向的代码,但是对代码做出的本地修改,没有办法直接更新到线上的代码评审中。

阿里巴巴的云效Codeup,支持线下到线上的代码协同。
三  云效Codeup代码评审中的协同
无论是 GitHub 还是 Gitlab,开发者创建代码评审首先需要将代码推送到线上独立的分支中(无论是在线上的派生仓库,还是目标仓库),然后再通过网页选择来源仓库、分支及目标仓库、分支,创建代码评审。
GitHub 和 Gitlab 这种代码评审方式,或者要引入冗余的派生仓库,或者需要为开发者赋予在仓库中的写入权限,并容易引发杂乱的分支管理。
1  适合主干开发的无分支创建代码评审
云效 Codeup 可以通过 git push 命令在客户端直接创建代码评审,无需创建派生仓库或者在仓库中创建特性分支。例如在客户端执行如下命令:

git push origin HEAD:refs/for/master/topic1

 

该命令会在服务端创建新的代码评审,或者如果已经存在相同用户、相同命令创建的代码评审则会更新评审中的提交。


建议安装我们开源的 git-repo 工具,则可以用更简单的命令行,实现从客户端创建/更新代码评审。

git pr

 

2  线下评审,线上协同
和 GitHub 类似,云效 Codeup 创建的代码评审都有一个特殊引用相关联,格式为:refs/merge-requests/{ID}/head。
代码评审者可以使用 git fetch 命令获取特定的代码评审(以编号123为例)指向的代码,进行线下代码评审。

git fetch origin refs/merge-requests/123/head
git switch -d FETCH_HEAD

 

如果安装了 git-repo,可以使用下面更为简洁的命令:

git download 123

 

代码评审者除了可以在本地仓库中浏览、调试代码,还可以更新代码、创建提交,然后将本地新增提交更新到线上的代码评审中。命令示例如下:

git pr -c 123

 

4.png

 

在云效 Codeup,开发者和评审者可以基于代码评审进行更为流畅的代码协同。

3  Git proc-receive 挂钩
上述“线下评审、线上协同”功能的核心是 Git 的 proc-receive 挂钩和 report-status-v2 新能力。这一功能由阿里巴巴贡献给 Git 社区,并在 Git 2.29.0 发布。

云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码安全无忧—云效Codeup代码加密技术发展之路

简介&#xff1a; 从代码服务及代码安全角度出发&#xff0c;看看云效代码加密技术如何解决这一问题 代码数据存在云端&#xff0c;如何保障它的安全&#xff1f; 部分企业管理者对于云端代码托管存在一丝担心&#xff1a;我的代码存在云端服务器&#xff0c;会不会被泄露&…

杀死 Oculus ,Facebook 改名 Meta ,是押注元宇宙还是“金蝉脱壳”?

整理 | 祝涛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;美东时间10月28日周四&#xff0c;在名为Facebook Connect的年度大会上&#xff0c;Facebook宣布&#xff0c;Facebook将公司名称更改为“Meta”&#xff0c;这个新名字反映了该公司在社交媒体之外的雄心…

java sdp_[java,SDP] java 7 SDP 技术/Socket Direct Protocol 2

With Java 7 and Sockets Direct Protocol , Java Now does RDMA ( Remote Direct Memory Access)有了 SDP 技术支持之后的 Java 7 已经开始逐步实现 RDMA 技术 (远程内存直接访问)RDMA is Remote Dynamic Memory Accesss -- which is a way of moving application buffers bet…

百信银行基于 Apache Hudi 实时数据湖演进方案

简介&#xff1a; 本文介绍了百信银行实时计算平台的建设情况&#xff0c;实时数据湖构建在 Hudi 上的方案和实践方法&#xff0c;以及实时计算平台集成 Hudi 和使用 Hudi 的方式。 本文介绍了百信银行实时计算平台的建设情况&#xff0c;实时数据湖构建在 Hudi 上的方案和实践…

如何做一场高质量的分享

简介&#xff1a; 每个人在分享前都应该先问自己这么一个问题&#xff0c;我为什么要分享&#xff1f;我觉得分享就一个最纯粹的原因&#xff0c;就是“我有一些知识&#xff0c;是别人不知道的&#xff0c;但对他人会有所帮助&#xff0c;所以我想分享给大家”。 作者 | 阿相 …

RTE2021,实时互动技术的进化与蝶变

10 月 22—23 日&#xff0c;由声网 Agora 主办的 RTE2021 实时互联网大会在北京圆满落幕。大会以“万象频道”为主题&#xff0c;带来了 20 余场实时互联网全生态线下论坛及活动、近百场的精彩演讲分享&#xff0c;覆盖技术开发、行业观察、创业投资、趋势洞察等多维度话题。同…

Java编程技巧之单元测试用例编写流程

简介&#xff1a; 立足于“如何来编写单元测试用例”&#xff0c;让大家“有章可循”&#xff0c;快速编写出单元测试用例。 作者 | 常意 来源 | 阿里技术公众号 温馨提示&#xff1a;本文较长&#xff0c;同学们可收藏后再看 :)前言 清代杰出思想家章学诚有一句名言&#xff…

KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力

简介&#xff1a; 在这篇博文中&#xff0c;我们将简要解释需要考虑的领域&#xff0c;KEDA 如何使应用自动伸缩变得简单&#xff0c;以及为什么阿里云企业分布式应用服务&#xff08;EDAS&#xff09;在 KEDA 上完全标准化。 联合作者 | Yan Xun&#xff0c;阿里云 EDAS 团队…

mysql行转列函数_一个小知识点-Hive行转列实现Pivot

前言传统关系型数据库中&#xff0c;无论是Oracle(11g之后)还是SQLserver(2005之后)&#xff0c;都自带了Pivot函数实现行转列功能&#xff0c;本文主要讲述在Hive中实现行转列的两种方式。传统数据库方式这种方式是借鉴在Oracle或者SQLserver在支持Pivot函数之前实现行转列的方…

安全之心:一文读懂可信计算

简介&#xff1a; 信 or 不信&#xff0c;这是个问题 可信计算 TC &#xff08;Trusted Computing&#xff09; 业界新宠&#xff0c;越来越被高频提到 本质是创造可信执行环境的芯片级安全防护方案 然而&#xff0c;江湖流传 TA 的传说 却鲜少有人见过真身 阿里云作为亚太区最…

国内顶级AI赛事再启程,第三届“中国人工智能大赛”聚焦算法治理、深度伪造与网络安全

本届大赛赛题分为算法治理、深度伪造和网络安全三大方向的七大赛题&#xff0c;分别是&#xff1a;过滤算法鲁棒性、深度伪造视频检测、深度伪造视频生成方法识别、基于人工智能的音视频合成比赛、说话人无关的音频深度伪造检测识别、说话人相关的音频深度伪造检测识别、Webshe…

看阿里云如何用云上技术创新,帮助哈啰单车实现智能数据收治

简介&#xff1a; 客户通过把日志数据迁移到SLS&#xff0c;替代原有的kafka、ES、ClickHouse&#xff0c;累积节省成本达到30%&#xff0c;同时满足了稳定性、扩展性需求&#xff0c;以及对日志查询分析的需求。 更多存储标杆案例 欢迎点击下方链接查看 阿里云存储标杆案例样…

快进键启动,一文带你了解云原生时代容器安全

简介&#xff1a; 分享阿里云容器安全的治理能力与经验&#xff0c;致力保护生产环境安全。 都说国内需求离容器化还远&#xff0c;更谈不上关注安全&#xff0c;喊的热闹而落地困难。但总得有些声音面向未来向前看。 在2020年Forrester IaaS安全评测中&#xff0c;阿里云容器…

Serverless:这真的是未来吗?(一)

简介&#xff1a; 希望这些博客文章能帮助您在所有相关人员中展开讨论&#xff0c;就最佳业务方案达成一致。该课程可能涉及无服务器&#xff0c;也可能不涉及。在这第一篇文章中&#xff0c;我们将考虑在讨论无服务器时最常见的几个问题。在第二篇文章中&#xff0c;我们将研究…

无限级分类限定层级_王者荣耀:s20战令该不该买?战令限定星元皮肤实测真香...

王者荣耀&#xff1a;s20战令该不该买&#xff1f;战令限定星元皮肤实测真香Hello大家好&#xff0c;我是游戏鲪&#xff0c;很高兴见到大家。如今这个赛季的战令系统早已结束&#xff0c;新赛季也即将到来。许多小伙伴都在憧憬下个赛季的战令。关于s20赛季的战令奖励&#xff…

光进铜退下的“更高”与“更低”,锐捷发布企业极简以太全光网解决方案

全新一代企业网络建设中&#xff0c;以太全光网将满足高带宽、简运维、降成本的要求。 头图 | 付费下载于视觉中国 出品 | CSDN云计算 近日&#xff0c;锐捷网络正式对外发布企业极简以太全光网解决方案。方案针对仓储物流、电子信息、工业制造、地产酒店等在行业客户在园区网…

物联网海量时序数据存储有哪些挑战?

简介&#xff1a; 随着 IoT 技术的快速发展&#xff0c;物联网设备产生的数据呈爆炸式增长&#xff0c;数据的总量&#xff08;Volume&#xff09;、数据类型越来越多&#xff08;Variety&#xff09;、访问速度要求越来越快&#xff08;Velocity&#xff09;、对数据价值&…

什么是 RedCap?一文详解!

作者 | 小枣君来源 | 鲜枣课堂随着3GPP R17版本的不断推进&#xff0c;一个新的名词逐渐开始热门起来&#xff0c;那就是RedCap。究竟什么是RedCap&#xff1f;为什么要引入它&#xff1f;它和现在的5G有什么区别&#xff1f;且看本文的深入解析……█ 什么是RedCapRedCap&…

被解救的代码 - 代码即服务时代来了!

简介&#xff1a; 人类对自由的追求从未停止&#xff0c;我们用战斗获得民族自由&#xff0c;我们用代码获得双手自由&#xff0c;同时代码作为服务器的奴隶&#xff0c;也开始蠢蠢欲动&#xff0c;革命已经开始&#xff0c;当代码翻身做主&#xff0c;作为开发者的我们又该如何…

配置审计(Config)配合开启OSS防盗链功能

简介&#xff1a; 本文作者&#xff1a;紫极zj 本文将主要介绍利用【配置审计】功能&#xff0c;如何快速发现企业上云过程中&#xff0c;针对未配置防盗链的 OSS Bucket 定位及修复案例。 前言 配置审计&#xff08;Config&#xff09;将您分散在各地域的资源整合为全局资源…