如何允许仅从测试分支合并到 master ?

How can I allow merging to master only from testing branch?

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

你说的对,一般情况下是不可能的。这比没有关于提交来自何处的信息更糟糕,因为提交不是 来自 分支:它们只是存在。 git push 请求由两部分组成,第一部分是传输任何提交和其他对象,第二部分 - 您可以为其编写钩子的部分 - please-or-forcefully 设置此集合指向那组提交哈希 ID 的名称。

例如,考虑一下如果我在我的系统上执行以下操作会发生什么:

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

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

话虽如此,您 可以 将约束放入 pre-receive 钩子中,以帮助人们避免 错误 。您无法解决所有问题,但可以找出一些明显的问题。我有一个精美的 pre-receive 钩子集 here 的例子。请特别注意 merges_from 函数及其调用者。它们使用当前存储在服务器上的名称,因此任何对中间分支具有适当权限的人都可以使用一系列两个或多个 git push 命令来破坏挂钩的意图。但是,如果用户只是以普通方式进行工作,并且您已按照评论中的概述配置了所有内容,则只有那些列为 "maintainers" 的用户可以将提交添加到 master,而无需先将它们推送到某个阶段或测试分支。

GitHub 等现代托管服务器具有类似(但更奇特)的规则,允许您在允许合并之前要求通过某种 continuous-integration(例如 Travis)测试。