LWN:对pull-request里面混乱的diffstats进行加工!

本文探讨了如何处理在Git拉取请求中出现的混乱diffstat情况,这种情况通常发生在有复杂开发历史的仓库中。文章解释了问题的原因,并提供了通过私下merge创建临时分支来生成清晰diffstat的方法,以确保pull请求能准确反映实际改动。
摘要由CSDN通过智能技术生成

关注了就能看到更多这么棒的文章哦~

Handling messy pull-request diffstats

By Jonathan Corbet
April 22, 2022
DeepL assisted translation
https://lwn.net/Articles/889760/

[编者注:以下内容是针对 linux-kernel 邮件列表中经常出现的问题而写出来的,本文在 5.18 合并窗口期间被合入了 mainline。]

各个子系统的维护者经常使用 git request-pull 来发起向 upstream 申请合入。通常,这个命令会给出一个包含在 request 中的 commit 的列表,以及一个漂亮的 diffstat 来显示哪些文件受到影响、每个文件被改动的程度如何。在内核邮件列表上有很多这样的例子。但是,在那些有着相对复杂的开发历史的 git 仓库有时候会产生一个包含大量不相关工作的巨大的 diffstat。这样的结果看起来就很难看了,而且还掩盖了 pull request 的实际作用。本文介绍了为什么会出现这种情况,以及如何解决这些问题。它源自《The Wisdom of Linus Torvalds》这个近年来已被发布过无数次的文章(例 1 https://lwn.net/ml/linux-kernel/CAHk-=wg3wXH2JNxkQi+eLZkpuxqV+wPiHhw_Jf7ViH33Sw7PHA@mail.gmail.com/ ,例 2 https://lwn.net/ml/linux-kernel/CAHk-=wgXbSa8yq8Dht8at+gxb_idnJ7X5qWZQWRBN4_CUPr=eQ@mail.gmail.com/)。

Git 开发历史,就是以一系列的 commit 的形式来进行的。简化来看的话,mainline kernel 开发是这个样子的:

f4906552f738fc63c971aa6ab13a6f0c.png


如果某个人想看看两个 commit 之间有什么变动,只要用下面这样的命令:

$ git diff --stat --summary vN-rc2..vN-rc3

这里的 git 历史上有两个明确的 commit(分别是 vN-rc2 和 vN-rc3)。Git 会从结束 commit 所包含的 commit 数量减去开始点所包含的所有 commit,来显示出差异结果。这个操作很明确,也很容易理解。

当一个子系统维护者创建了一个 branch 并向其提交了一些修改,那么在最简化的情况下,会是看起来是这样的:

c3874ef6b7b862e58b3327fb222080da.png

如果该维护者现在用 git diff 来查看 mainline branch(姑且称为 linus)和 cN 之间的变化的话,仍然有两个明确的端点(分别是 vN-rc2 和 cN),结果与预期一致。因此,用 git request-pull 生成的 pull request 也是符合预期的。但现在我们来讨论一下一个稍微复杂一些的开发历史:

daec14cf369af88d8df67d21b1c6f1aa.png

维护者在 vN-rc1 创建了一个 branch,在 vN-rc2 创建了另一个 branch,然后这两个分支被合并到 c2。现在,为 cN 生成的 pull request 最终可能确实看起来很混乱,而开发者就会摸不着头脑。

这里实际发生的情况是不再有两个明确的端点来供 git diff 操作使用了。在 cN 上的各种开发工作是在两个不同的地方开始的。为了生成 diffstat,git diff 最终不得不选择其中一个,并希望得到最好的结果。如果 diffstat 从 vN-rc1 开始,它可能会包括从那里到第二个开始点(vN-rc2)之间的所有改动,但是这肯定不是我们的维护者想要得到的。由于 diffstat 中的所有这些多余信息,我们可能无法判断 cN 的改动中到底包括了什么。

维护者经常试图通过一些方式来解决这个问题,比如重新 rebase 这个 branch,或与 linus 分支再进行一次 merge,然后重新创建 pull request。这种方法往往会让收到 pull request 的人感到很难受。在向 upstream 推送之前,在推送给 upstream 之前进行 rebasing 或者 merging 是一种众所周知的会得到暴躁回应的方式。

那么该怎么做呢?遇到这种情况时,最好的应对方法是与你期望想 pull 进去的的目标分支进行一次 merge,但要私下进行,就像这是一件见不得人的事情一样。先创建一个新的、准备后续抛弃的分支,在那里进行 merge:

ac5ca60e1f4ad4443b0e2f6e5e9b0636.png

这个 merge 操作解决了由多个起始点而导致的所有的复杂问题,产生了一个只包含与 mainline branch 的差异的清晰的结果。这样在生成 list 的时候只有两个清晰的端点了,所以现在可以生成一个包含所需信息的 diffstat:

$ git diff -C --stat --summary linus..TEMP

请保存这个命令的输出内容,然后直接把 TEMP branch 删除掉,绝对不要让其他人看到这个 branch。把保存的 diffstat 输出内容添加到之前混乱的 pull request 中去,就产生一个展示真实情况的结果,然后就可以向 upstream 发送该请求了。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

184c243a2c41a5b74b5823f13a289461.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值