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