LWN: "git request-pull"里的混乱diffstat信息

语言: CN / TW / HK

点击上方蓝色“ Linux News搬运工 ”关注我们~

"git request-pull" and confusing diffstats

By Jonathan Corbet

October 21, 2019

当某位内核维护者希望发送一批commit给mainline的时候,通常都会使用git request-pull命令。不过过去几年,很多维护者都碰到过此命令有时候面对很简单的commit history也能输出一些很奇怪的结果。最近在linux-kernel mailing list上的一些讨论解释了为什么会出现这种现象,以及维护者该如何处理。

git request-pull本身设计时是希望做成一个通用命令的,不过其实大家都明白,它的输出信息其实是针对一位特殊用户的需求的。它包含的诸多信息,其实都是供Linus Torvalds用来判断是否合入mainline的。这些信息包括:这些改动是基于哪个commit的,改动中最新的commit的时间戳,来自哪个git tree,maintainer对这些改动的描述信息,commit的列表(按照git shortlog输出格式),用来展示哪些文件被修改了的diffstat信息。

下面的例子是一个简单的开发历史示例:

可以很简单的生成commit log以及diffstat信息,然后就能得到漂亮的pull request了。

最近,Will Deacon碰到了一个比较复杂的场景。他的代码本来是基于5.4-rc1的,不过后来他得merge到5.4-rc2,因为他要合入的某个fix是依赖5.4-rc2的。因此,他的代码库history就像是下面这样了:

如果这时用git request-pull来生成信息的话,commit-log这一部分看起来还是很正常的,包含了local tree(本地代码库)的改动。不过diffstat就包含了大量不相关的改动,这样生成的pull request看起来就特别吓人,改了非常多的文件。实际上,diffstat不仅包含了本地的改动,也包含了5.4-rc2合入到local tree的时候引入的所有那些commit。这样就导致我们没法快速看清楚这个pull request里面到底改动了哪几个文件。

Deacon看到commit log正确而diffstat有问题的时候,感到很惊奇。不过Torvalds回信做了解释:“log和diff有一些根本性的区别。log是对一系列commit所做的操作(因此人们必须列出每一个commit,而不是只提供起始和结束这两个),而diff是针对两个节点之间所做的操作,展示这两个节点之间的区别。shortlog和diffstat的summary输出信息是一致的。”

Torvalds继续讲道,假如只有起始和结束节点信息,并且历史简单的话,git等工具都可以轻松算出两者之间的区别。不过如果在这个历史记录中间插入了一个merge操作就复杂了,这样就多了一个端点。最终结果就是pull request中diffstat的信息就没用了。

Deacon的解决办法是再做一次merge来把目前mainline最新节点merge进来:

这样调用diffstat的时候可以指定只比较mainline以及上面这个合并之后的代码tree,这样一来,看到的代码差异就只有Deacon本地的新增改动了。然后他手动把这个干净版本的diffstat加入pull request就好。上面的merge过的代码tree就可以抛弃掉了,不能直接把这个tree发送给upstream。正如Torvalds所说的,上面的merge操作就又回到了2个端点的情况,从而解决了diffstat的问题,拿到了正确的输出信息。

maintainer是否应该每次在发送pull request之前都要做这种操作呢?Torvalds看起来很赞赏这样做一下。他认为这样得到的pull request也算是“good quality”的。不过他也提到,经常有pull request包含了错误的diffstat信息发到他这里来,不过他也都轻松处理掉了。当然,maintainer如果希望能尽量让Torvalds满意的话,那还是做一下额外工作较好。

最好的方案当然是直接修复git request-pull命令。不过,因为merge history可能很复杂,因此不一定能得到大家预期的输出信息。同时,按照上面举的例子,输出正确信息还需要改动本地git repository(仓库),而request pull命令还是不希望做这个改动的。不过正如Ingo Molnar所说,至少git request-pull应该能检测出这种情况,然后及时报出警告信息。这样开发者至少不会被这么一个diffstat给吓到了,因为直接发送给upstream之后大家肯定会看到这个混乱信息的。

全文完

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

极度欢迎将文章分享到朋友圈 

长按下面二维码关注:Linux News搬运工,希望每周的深度文章以及开源社区的各种新近言论,能够让大家满意~

分享到: