代码评审中的代码协同

简介: 代码评审中同样存在着“Talk is cheap. Show me the code”,语言无力时,直接上代码吧。这就是我们今天要讨论的话题——代码评审中的代码协同。

image.png

作者 | 知忧
来源 | 阿里技术公众号

大神说:“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

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

image.png

  • 邮件头中的 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 代码评论中嵌入代码块

下图中,点击评论工具栏第一个按钮,可以在评论中嵌入代码块:

image.png

2 评论中代码块转换为提交

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

image.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

image.png

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

3 Git proc-receive 挂钩

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

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

原文链接

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

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

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

相关文章

山东师范大学志愿推荐系统邀请码_快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦...

快看点邀请码填写HGC1QK快看点邀请码填写HGC1QK快看点邀请码大家千万不要乱填写哦快看点官网下载是一款非常好玩的软件&#xff0c;喜欢此类风格的用户可以体验一下哦。快看点官网下载特色系统:如此好玩的快看点官网下载&#xff0c;千万别错过&#xff0c;来下载体验吧&#x…

10种编程语言实现Y组合子

简介&#xff1a; Y组合子是Lambda演算的一部分&#xff0c;也是函数式编程的理论基础。它是一种方法/技巧&#xff0c;在没有赋值语句的前提下定义递归的匿名函数&#xff0c;即仅仅通过Lambda表达式这个最基本的“原子”实现循环/迭代。本文将用10种不同的编程语言实现Y组合子…

7读不出来卡显示无服务器,win7识别不了网络如何解决_win7显示未识别网络的处理方法...

我们在使用萝卜家园win7系统系统久了之后难免会出现各种问题&#xff0c;例如最近就有网友向小编反映说自己的win7出现了识别不了网络的情况&#xff0c;不知道怎么解决很是苦恼。没关系&#xff0c;下面本文就为大家整理了关于win7显示未识别网络的处理方法。处理方法如下&…

走完线上 BUG 定位最后一公里

简介&#xff1a; 因为线上线下环境隔离的问题&#xff0c;线上的输入很多时候难以在日常环境中构造&#xff0c;定位 bug 效率低下。是否有简单快捷的办法呢&#xff1f; 一个小故事 周末12点的闹钟在回龙观均价3000的出租屋急促的响起&#xff0c;程序员小A慵懒的拿过手机&…

不带头节点的链表有哪些缺点_14. 删除链表中重复的结点

删除链表中重复的结点 题目描述在一个排序的链表中&#xff0c;存在重复的结点&#xff0c;请删除该链表中重复的结点&#xff0c;重复的结点不保留&#xff0c;返回链表头指针。 例如&#xff0c;链表1->2->3->3->4->4->5 处理后为 1->2->5写链表中我…

基于 Flutter 的 Web 渲染引擎「北海」正式开源!

简介&#xff1a; 阿里巴巴历时 3 年自研开发的 Web 渲染引擎北海&#xff08;英文名&#xff1a;Kraken&#xff09;正式开源&#xff0c;致力打造易扩展&#xff0c;跨平台&#xff0c;高性能的渲染引擎&#xff0c;并已在优酷、大麦、天猫等业务场景中使用。 作者 | 染陌 来…

“倚天”一出,谁与争锋?阿里发布首颗云芯片倚天 710,死磕自研芯

作者 | 贾凯强、伍杏玲 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09;10 月 19 日&#xff0c;2021 年云栖大会正式拉开帷幕。达摩院院长、阿里云智能事业部总裁张建锋表示&#xff0c;如今一个以云为核心的新型计算体系结构正在形成&#xff0c;该…

三菱m70刀杯上下m代码_加工中心常用G代码和M代码大全,收藏好了

我们在使用数控加工中心的过程中&#xff0c;最常见的数控代码有两种&#xff0c;一种是G代码&#xff0c;一种是M代码。本文整理了常见的G代码和M代码的含义&#xff0c;不同厂商不同的数控系统可能稍有出入&#xff0c;在实际中以说明书为准。G代码&#xff1a;准备功能&…

DataWorks搬站方案:Azkaban作业迁移至DataWorks

简介&#xff1a; DataWorks迁移助手提供任务搬站功能&#xff0c;支持将开源调度引擎Oozie、Azkaban、Airflow的任务快速迁移至DataWorks。本文主要介绍如何将开源Azkaban工作流调度引擎中的作业迁移至DataWorks上。 DataWorks迁移助手提供任务搬站功能&#xff0c;支持将开源…

DataWorks搬站方案:Airflow作业迁移至DataWorks

简介&#xff1a; DataWorks提供任务搬站功能&#xff0c;支持将开源调度引擎Oozie、Azkaban、Airflow的任务快速迁移至DataWorks。本文主要介绍如何将开源Airflow工作流调度引擎中的作业迁移至DataWorks上 DataWorks提供任务搬站功能&#xff0c;支持将开源调度引擎Oozie、Az…

mysql的每隔1分钟定时_深入研究MySQL(四)、备份与恢复

一、前言知道备份的重要性吗&#xff1f;没经历过的可能永远不知道&#xff0c;我们在重装系统、手机升级等时候&#xff0c;备份一下必要数据总是有好处的&#xff0c;指不定哪个神操作导致磁盘数据丢失&#xff0c;前些日子删库跑路被判刑的那位老哥&#xff0c;如果公司有备…

重磅发布 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障

简介&#xff1a; DataTrust&#xff08;隐私增强计算产品&#xff09;是基于阿里云底层多项基础安全能力&#xff0c;经过阿里云数据中台丰富的客户业务实践&#xff0c;构建的一款为企业数据安全流通的产品。 随着包括零售、制造、金融等多行业数字化转型加速推进&#xff0…

完全无人驾驶量产车Apollo Moon威马版首秀 成本降一半、能力翻10倍

2021年10 月19日&#xff0c;百度Apollo联合威马正式发布两款新车&#xff0c;新车型均基于威马W6打造。一款是配置激光雷达的新一代无人车Apollo Moon量产车型&#xff08;Apollo Moon威马版&#xff09;&#xff1b;另一款是搭载百度ANP领航辅助驾驶系统与AVP自主泊车系统的量…

二阶振荡环节的谐振频率_自动控制系统时域分析十三:对数频率特性

一&#xff1a;对数频率特性曲线(波德图-Bode图)Bode图由对数幅频特性和对数相频特性两条曲线组成。⒈波德图坐标(横坐标是频率&#xff0c;纵坐标是幅值和相角)的分度&#xff1a;1)横坐标分度(称为频率轴)&#xff1a;它是以频率w的对数值logw进行线性分度的。但为了便于观察…

深入分析 Flutter 渲染性能

简介&#xff1a; Flutter 有很多优点&#xff0c;特别是对于开发者来说&#xff0c;跨平台多端支持&#xff0c;丰富的 UI 组件库和交互效果&#xff0c;声明式 UI&#xff0c;React 的更新方式&#xff0c;Hot-reload 提高开发效率等等。虽然它在渲染性能上有不少缺陷&#x…

张勇云栖大会谈科技担当与责任:做开放共享人人受益的好科技

10月19日&#xff0c;2021云栖大会在杭州开幕&#xff0c;阿里巴巴集团董事会主席兼首席执行官张勇在主论坛致辞中表示&#xff0c;从万物互联到万物生长&#xff0c;云栖大会经过12年的轮回&#xff0c;正站在一个新的起点上。阿里希望在基础研究方面有更多、更扎实的社会担当…

技术干货 | 源码解析 Github 上 14.1k Star 的 RocketMQ

简介&#xff1a; 站在发送方视角&#xff0c;通过源码&#xff0c;来分析在事务消息发送中 RocketMQ 是如何工作的。 前言 Apache RocketMQ 作为广为人知的开源消息中间件&#xff0c;诞生于阿里巴巴&#xff0c;于 2016 年捐赠给了 Apache。从 RocketMQ 4.0 到如今最新的 v4…

编译后没有taget文件夹_matconvnet安装、编译、配置

一、安装&#xff08;可见大神windows下编译Matconvnet的方法(CPU和GPU)&#xff09;1.&#xff08;本人&#xff09;安装matlab2015b、Visual Studio 20152.官网Home - MatConvNet下载matconvnet工具包&#xff0c;我的名字是matconvnet-1.0-beta25&#xff0c;然后解压文件到…

面对大规模 K8s 集群,如何先于用户发现问题?

简介&#xff1a; 怎样才能在复杂的大规模场景中&#xff0c;做到真正先于用户发现问题呢&#xff1f;下面我会带来我们在管理大规模 ASI 集群过程中对于快速发现问题的一些经验和实践&#xff0c;希望能对大家有所启发。 作者 | 彭南光&#xff08;光南&#xff09; 来源 | 阿…

第7届UBBF在迪拜举办 加强网络设施建设将加速产业发展成为共识

今天&#xff0c;由联合国宽带委员会和华为共同举办的第7届全球超宽带高峰论坛&#xff08;UBBF 2021&#xff09;在迪拜开幕。作为固网领域全球最大的峰会&#xff0c;今年的UBBF以“联接&#xff0c;新增长”为主题&#xff0c;全球领先的运营商、设备商共同围绕“网络基础设…