鲲鹏社区首页
中文
注册
如何提交好的PR

如何提交好的PR

openEuler

发表于 2023/08/09

0

“一个成功的码农是从一个合格的PR开始的”,下文列出了关于该主题的一些摘要,完整的内容请查看视频原文。


如上图所示,所谓PR,即Pull Request(拉取需求),主要由以下几个部分组成:
(1)题目
(2)内容
(3)评论、提交信息、文件信息等

为什么PR如此重要呢?因为它是开源世界大规模软件开发的基石,也是其最重要的流程点。

(1)它是质量保证体系的基石。PR是真正合入代码和更新的入口,直接影响到最终交付件的质量。

(2)它是大规模协作开发的基石。在一个互相不见面的“虚拟世界”,PR几乎是大家交流最重要的通道和“语言”。

(3)它是社区历史的记录。PR不会被删除(除非它所在的仓库被彻底删除),每一个PR都记录在了社区历史中,是社区文化的传承载体之一。

下面让我们来看几个“糟糕”的PR:

1. Bad PR Example1

这个PR主要的问题是无信息量,试问:

(1)说要加入这位maintainer,但是为什么要加的是他而不是其他人?

(2)提交这个PR时该SIG项目不多,为什么要引入这么多maintainer?

(3)新加入的这个maintainer后续在项目中的分工和作用是什么?

在后面的comment中提交者把这些信息都补全了,所以该PR最终被合入了。但是单看这个PR本身,这是个非常不合格的PR。

2. Bad PR Example2

这个PR比第一个例子要好一点——题目写的很清楚,在描述中也做了部分解释。但审批者看到这个PR“先天”会提出以下问题:

(1)为什么要这样建仓?我们对gcc版本10是重量级的开发吗?

(2)需不需要像kernel那样的组织形式?如果类似内核,那应该只有gcc这样的仓而通过分支来进行版本区分,而不是像这样一个版本一个仓。

所以对这些自然会遇到的问题在提交PR时就应有所解释。

3. Bad PR Example3

这是一个“接近完美”的PR。

(1)题目写得非常清晰:引入一个软件包。

(2)主体内容对这个包做什么做了详细的解释,同时说明了上游社区活跃、Licence友好等情况。

但是,审批的人会问如下问题:

什么业务需要引入这个软件,不能只说这个软件好,“好”软件成千上万,为什么要单单引入这个?它和我们这个项目有什么关系?当然,提交者后面的回答补全了这些信息:


糟糕的PR会对世界产生什么影响呢?下面列出了几条:

(1)极大地降低工作效率,增加无谓的资源消耗。

(2)延长审批时间,使提交者和审批者双向不满。

(3)影响产品交付质量。

那么,如何写一个好的PR?

(1)一个PR对应一个事情,不要把不同的事情放在一个PR中,保持PR的干净整洁。

(2)PR首要是说清楚why,就是原因,为什么会有这个PR,这个PR解决了什么问题。

(3)PR中的描述要清晰明了,讲清楚commit中的要点是什么。

(4)一般来说,一个PR必须要有一个issue对应,这样才能形成需求和开发代码之间的对应关系。任何进入代码仓的内容是需要有原因的。

4. Good PR Example1

这是一个比较好的PR的例子,主要表现在:

(1)题目清晰。

(2)内容的可读性好,比如说是分了3个部分,每个部分做什么讲的非常清晰。

(3)还注明了希望谁来检视。

需要说明一点的是,虽然以上用来演示的PR都是TC管理的PR(如建仓、管理流程等),更多偏向于技术审批类,但代码提交、特性开发、问题修正、文档写作等的PR,其本质要求都是一样的。

结束语:

PR是码农成功的开始——一个PR写的好的码农未必能成长为一个伟大的码农,但是一个PR写不好的码农注定无法成为一个伟大的码农——让我们从写好每一PR开始吧!

附:以下列出了一些比较差的PR及其评审者的回复,大家可以从中学习。

较差PR案例

链接


没有清理干净提交,含有无意义的文件

https://gitee.com/openeuler/community/pulls/1848

简单覆盖diff

https://gitee.com/src-openeuler/python-zeroconf/pulls/2

依赖关系的建立,先要找全依赖,再提交主包

https://gitee.com/src-openeuler/python-zope-interface/pulls/7

没有空行,可读性差

https://gitee.com/src-openeuler/perl-String-Util/pulls/1

无效的URL

https://gitee.com/src-openeuler/python-adb-shell/pulls/1

没有获取最新的版本

https://gitee.com/src-openeuler/python-fisx/pulls/1

一个事情分成了不同的PR提交

https://gitee.com/openeuler/community/pulls/2496

马虎大意的issue

https://gitee.com/open_euler/dashboard?issue_id=I42IR8
https://gitee.com/openeuler/community/pulls/2548

没有在老的PR上修改,新开PR,导致信息缺失

https://gitee.com/openeuler/community/pulls/2559
https://gitee.com/openeuler/community/pulls/2556

完全覆盖式的PR

https://gitee.com/src-openeuler/python-astroid/pulls/5

并没有检视最新的github的版本,只是采用了pypi中的版本

https://gitee.com/src-openeuler/python-pure-sasl/pulls/1

master软件引入老版本分支

https://gitee.com/openeuler/community/pulls/2616

conflict命令的引入

https://gitee.com/openeuler/community/pulls/2583

changelog的描述“正确但无用”

https://gitee.com/src-openeuler/memleax/pulls/8
https://gitee.com/src-openeuler/perl-Unicode-LineBreak/pulls/6