禁止在git中向主分支远程推送

18
有没有办法修改中央仓库的配置,禁止通过git远程推送到主分支(master)?只允许发布所有者通过合并分支来更新。在子仓库中可以这样做,但是不总是足够保险,因为可能会忘记在新机器上进行设置 - 无法防止意外推送。开发人员应该能够从任何分支拉取并推回到任何分支,除了我们希望只读的master分支。这是否可能使用git实现?或者我们正在尝试错误的流程。
更新tl;dr: 感谢Charles Bailey,答案是检出master分支,然后添加以下配置:
receive.denyCurrentBranch = true

1
我在如何配置中央“开发存储库”的只读分支?中提供了一个类似问题的示例脚本。 - Alberto
1个回答

12
你应该查看git分发中contrib目录下名为update-paranoid的示例更新挂钩。它允许您设置每个分支的ACL,限制谁被允许推送到哪些分支。这样,您就可以将更新主分支的权限限制为仅发布所有者。
我不太确定你所说的“仅通过分支合并更新”是什么意思。我假设你的中央仓库是空的,在这种情况下,分支通常只能通过推送来更新。在Git中,在推送合并提交和非合并提交之间没有概念上的区别,因此我不确定您旨在限制对主分支的更新类型的标准是什么。
如果您正在向非空的中央存储库推送,并且master始终是检出的分支,那么您只需将配置变量receive.denyCurrentBranch设置为truerefuse

应该在本地完成(通过合并),而不是我们想要禁止的远程 push。不,它不是裸的 - master 已经检出并且是一份工作副本,可以这么说。谢谢,我会查看 update-paranoid,也许限制为一个人就可以了。 - kibitzer
好的,我来回答。为什么你的中央仓库不是裸仓库,一般检出哪个分支? - CB Bailey
“master” 是当前检出的分支;我们可以创建一个裸仓库,但我认为没有必要,因为我们的想法是禁止直接推送到 master 分支;因此有这个问题。如果在我们追求只读主分支的过程中,从中拉取会有所帮助,我们可以创建一个裸仓库并从中拉取。 - kibitzer
1
好的,在你的特定情况下,最简单的解决方案是将配置变量 receive.denyCurrentBranch 设置为 truerefuse。这将防止任何人通过推送更新当前分支,即主分支。 - CB Bailey
简单而有效,正是所需。谢谢!(我猜这里有个拼写错误 ;) )。 - kibitzer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接