Git-在允许推送到分支之前需要合并来自master的提交

时间:2019-03-20 11:15:24

标签: git

我们希望通过允许这些分支从主分支中拉出/合并,然后再允许推送到开发分支(如果对主分支进行任何更改)来防止开发分支之间的长时间合并冲突。这可以强制执行吗?

1 个答案:

答案 0 :(得分:2)

是,取决于托管中央存储库的方式。如果将其托管在GitHub或GitLab.com之类的网站上,则可能无法实现,因为这些类型的提供程序不允许您提供自己的代码来检查推送(您可以通过其网络界面配置一些限制,但我不能)想不到那里想要什么)。

对于自托管存储库,您可以在update挂钩中执行此操作(请参阅documentation for hooks)。这是一个我尚未实际测试过的示例:

#!/bin/sh
if [ "$1" = "refs/heads/development" -a "$(git rev-list $3..master)" ]; then
  echo "ERROR: master is not merged into development, please try again" >&2
  exit 1
fi

如果您从development上的提交集中减去master的新状态下的提交集,这实际上检查了“什么都没剩下”。如果您已合并,development将拥有master的所有提交,因此结果将是空集。

这很简单,但有一些小缺点:

  • 如果相同的推送也更新了master,则此挂钩中的检查可能尚未意识到对master的新更改,因此在这种情况下,您可能会得到错误的否定(未合并的更改,但是推动通过。)
  • 如果master上发生的最后(也是唯一)新事件是来自development的合并,则该钩子会给出各种误报,因为master将具有合并提交而development不会。当然,我们知道这是两个分支之间的非实质性差异,但是挂钩中的简单设置算法无法理解这些区别。