我可以禁用某些分支的强制推送吗?

Can I disable force-push for certain branches?

我想知道是否可以为所有开发人员使用的某些主要分支禁用 force pushing(例如:devmaster)。开发者可以强制推送他们的私有分支。

是的,如果您有权访问承载您要推送到的存储库的服务器(请记住,从技术上讲,您可以推送到任何地方;由于 Git 的分布式特性,无法普遍禁用推送).

在您想要拒绝推送的回购中,您只需从预推送挂钩中 return 0 即可。有关预推挂钩的示例,请参阅 Git 安装提供的示例:

https://github.com/git/git/blob/master/templates/hooks--pre-push.sample

另一种技术是要求您的用户使用执行本地策略的自定义包装器;实际上有很多值得推荐的技术,因为它允许您以更灵活的方式执行其他本地策略。缺点当然是交通不便。

当然,您采用的方法取决于您的要求。如果您试图防止潜在的滥用(故意破坏或未经授权的使用),包装器将无济于事。然而,大多数人不处于那个位置(通常授权用户是可信的),包装器是一个有吸引力的选择。我们用本地包装器限制的事情的一个例子是将大图像或视频添加到网络存储库:我们有一个 CDN 复制机制来处理这些。但是,很容易忘记,并添加图像用于测试目的,不久之后,存储库就会变得又大又笨重。

作为编写 Git 包装器(并从中获得价值)的人,我的建议是不要尝试 "improve" Git 接口。大多数用户希望像往常一样使用 Git(而不是 Git 中的某些 "flavor")。为此,包装器通常只提供额外的限制,不允许某些类型的提交、推送等。但接口与常规 Git 接口保持不变。