如何才能允许合并仅从测试分支中掌握?

时间:2018-02-25 19:29:12

标签: git githooks

我有一个master分支和一个testing分支。我将一些内容推送到testing,当一切正常并经过测试时,我将testing分支合并到master。有没有办法创建这样一个服务器挂钩,禁止将提交推送到master,而不是testing分支的合并提交? 在我看来,这是不可能的,因为pre-receive钩子不包含有关提交来自何处的信息(什么分支)。

1 个答案:

答案 0 :(得分:0)

你是对的,一般来说是不可能的。这比没有提交来自何处的信息更糟糕,因为提交不是来自分支:它们只是存在。 git push请求由两部分组成,第一部分是通过任何提交和其他对象进行传输,第二部分 - 您可以编写一个钩子for-being 请 - 或 - 强制设置这组名称指向那组提交哈希ID。

例如,考虑一下,如果我在我的系统上这样做会发生什么:

git checkout $hash1
git merge $hash2
git push your-server HEAD:refs/heads/master

我使用 no 分支在 no 分支上进行了合并提交。我将此提交发送到您的服务器并要求您的服务器将服务器的master设置为指向此提交。

话虽如此,你可以将约束放入预接收挂钩中,以帮助人们避免错误。你不能解决所有情况,但你可以抓住一些明显的情况。我有一组花哨的预接收挂钩here。特别注意merges_from函数及其调用者。它们使用当前存储在服务器上的名称,因此对中间分支具有适当权限的任何人都可以使用两个或更多git push命令的序列来破坏钩子的意图。但是,如果用户只是以普通的方式完成工作,并且您已按照注释中的说明配置了所有内容,则只有那些列为“维护者”的用户才能将提交添加到master,而无需先将其推送到某些分段或测试分支。

现代托管服务器(如GitHub)具有类似(但更加高级)的规则,允许您在允许合并之前要求传递某种连续集成(例如,Travis)测试。