GIT: 如何保护分支不被其他开发人员删除?

16

在我们的产品首次发布后,我们将切换到不同的分支进行主要开发和功能开发。有没有一种方式可以创建一种分支,使其受到保护,除非您是一个特定的用户(基于角色或用户名),否则不能被意外或故意删除?

我尝试在本地gitlab机器上创建一个示例git仓库,然后通过网站上的选项保护其中的一个分支,但是我可以使用 git push origin:branch_name 将其删除。提前致谢!

这个解决方案适用于github.com吗?


1
假设向 :branch_name 推送也会触发 update 钩子,可以参考此链接:https://dev59.com/tXE95IYBdhLWcg3wEpvo - eckes
钩子在github.com上能用吗? - Sherzod
可以,会起作用(https://help.github.com/articles/post-receive-hooks),但没有“update”钩子。错过了“github”标签。抱歉。 - eckes
遗憾的是,GitHub仍然不支持本地存储库等解决方法之外的原生保护分支功能。Bitbucket具有保护分支的能力! - jontsai
这将很快(2015年9月)在GitHub上提供。请参见下面的我的答案 - VonC
显示剩余2条评论
5个回答

8

有多种方法可以解决这个问题:

  1. 新建一个沙盒仓库,并将主仓库设为只读权限。如果用户误删了分支,他们可以从主仓库中获取该分支。这种方法假定你只是使用github来管理远程代码库。
  2. 在代码库中设置钩子,除非你是特定的用户,否则不允许删除分支。在github上无法执行任意代码,因此无法实现这个方法。但是如果你使用本地代码库,则可以实现。
  3. 设置本地gitolite安装程序来管理分支权限。

2
换句话说,没有本地的方法可以做到这一点,除非使用黑客手段? - Sherzod
这些不是黑客行为。一个受保护的仓库是DVCS中的一种模式。Github不能允许您安装自定义代码。在Github之前,您有自己的裸仓库坐在内部服务器上。听起来你们可以使用gitolite安装。 - Adam Dymitruk
是的,我明白。我们确实有本地的git,但我们计划转换到github,我想知道他们是否在那里实现了这个目的或者是否可以实现一些自定义的东西。 - Sherzod
据我所知,并没有这样的功能。他们可能会添加这个特性。你可以使用GitHub作为代码审查和其他功能的辅助工具,但是要保留一个主要的本地存储库。 - Adam Dymitruk
@AdamDymitruk:“祝福存储库是DVCS中的一种模式”-实际上并不是这样。在git之前,我从未听说过这个。在mercurial(一个真正的DVCS)中,您不需要这样做。在git中,分支概念是如此功能失调,以至于人们提出像“祝福存储库”或裸存储库作为代理的东西。事实上,git的当前默认设置使其成为没有D的VCS?不相信吗?只需从一台PC推送到另一台PC即可。它会告诉您不要破坏其他的副本,这是被禁用的。看...没有“D”。Git想要它的中央服务器副本。拥有其中一些的能力并不能使它成为DVCS! - schnedan

5

由于 OP shershams 在评论中提到了这一点, 我们计划转向 Github,我想知道他们是否在这个目的上有所实现。

事实证明,GitHub已经实现了一些功能(很快就会推出):

受保护的分支和必需的状态检查(2015年9月3日)将允许您保护一个分支:

  • 防止强制推送
  • 防止删除
  • 对合并的更改进行保护,直到必需的状态检查通过

https://cloud.githubusercontent.com/assets/25792/9596474/27db3ce6-502a-11e5-9b19-5b47a8addc65.png

请注意,自2019年12月4日起,您可以通过启用允许删除,授予所有具有推送权限的用户删除受保护分支的能力。

4
您可以通过在服务器上添加一个 pre-receive hook 来使用分支权限,以保护您的代码库。在裸仓库的配置文件中添加以下内容即可:
[hooks]
        allowedtomerge = user1,user2,user3
        protectedbranches = master

1
我有一个git分支模型,其中包含用于分阶段部署的dev/master/production分支,因此有些分支需要受到保护以防止被删除。 我使用拉取请求和Visual Studio Team Services,所以例如从dev到master的每个拉取请求后,VSTS会询问是否要删除源分支(dev)。
我担心开发人员会意外删除dev或其他重要的用于部署的分支,因此我使用了以下技巧:
我从dev创建了一个名为“save”的分支,进行了一行更改,对dev打开了一个拉取请求,然后只需将其保持打开即可。
只要对dev有一个打开的拉取请求,dev就不能被删除,VSTS也不会询问是否要删除该分支。
如果有任何其他官方解决此问题的方法,我很乐意使用它。但是目前,这很容易且有效。

0

如果您正在使用Gitlab,则可以配置受保护的分支

配置受保护的分支

要保护分支,您需要至少具有主权限级别。请注意,默认情况下,主分支是受保护的。

  1. 导航到您的项目设置➔存储库

  2. 滚动查找受保护的分支部分。

[...]


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