强制变基的通常原因是对合并提交的病态仇恨,因为设置策略的人看不到它们的价值。目前尚不清楚为什么要利用 rebase 的缺点(可能是中间提交不会经过测试)但仍然有合并;在我看来,这似乎是最不有价值的合并提交。但如果你必须...
您暗示您要接受的合并将是“空的”;这并不完全正确。它将更改应用到它的第一个父级(尽管不是它的第二个父级,因为如果允许的话,这将是一个快进)。
我认为您真正要说的是,如果第一个父级可从第二个父级访问(通过父级指针),您将接受合并。所以你可以获取
的输出
git rev-list --merges $oldrev..$newrev
并将每个生成的提交 ID 作为 commit-ID 参数输入
git merge-base --is-ancestor commit-ID^ commit-ID^2
如果merge-base 命令返回非零,则拒绝。
(从技术上讲,我猜您可能还想确保提交没有 3 个或更多父项。)
这仍然允许这样的事情
(origin/master)
|
x -- x -- x -------------------- M <--(master)
\ /
x -- x -------x -- x
\ /
x -- x
如果避免这是一条规则,那就更难了;您基本上希望每个合并都可以通过头部提交的第一父指针访问。 (但你不能只是说应该可以从头部提交的第一个父级访问合并,因为那样你仍然允许
(origin/master)
|
x -- x -- x -------------------- M -- x<--(master)
\ /
x -- x -------x -- x
\ /
x -- x
这是同一件事。)因此,作为开始寻找合并之前的“第一步”,您可以做一个
git rev-list --first-parent $oldrev..$newrev
并挂在返回的所有提交 ID 值的列表上,这样当您找到每个合并时,您可以确认它在该列表中。
如果这一切听起来一点都不好玩,我完全同意;这就是为什么我不会费心尝试根据这个建议组装一个工作脚本的原因,以及为什么我建议你要么允许合并,要么不这样做,而不是尝试采取这种不寻常的中间立场。