我们有一个bitbucket服务器,我们已经介绍了Pull Requests的使用来保护两个分支:Master和Develop。
这很好用,人们不能再推送到我们的bitbucket服务器上的那些分支。
但问题是,有时当我们使用开发版本来测试某些行为时,我们忘记更改分支以进行修改,我们在本地做一些提交,我们无法推送到服务器。
我的问题是:有没有办法阻止用户使用共享规则或其他东西对这两个分支进行攻击?
一些重要的要求:
非常感谢
不是How to restrict access to master branch on git的副本,因为另一个问题是服务器拒绝提交,这已经存在。它不会阻止开发人员在开发而不是他们的分支上通过错误提交,并使他们有时间将他们的更改移动到另一个分支。如果无法提交,则可以帮助我们快速查看此错误。
答案 0 :(得分:1)
您可以做一件事,但需要您的用户积极参与。他们必须安装预提交钩子。
预提交钩子可以非常简单:
#! /bin/sh
# pre-commit: fail if current branch is master or develop
case "$(git rev-parse --abbrev-ref HEAD)" in
master|develop) echo "make a new branch first" 1>&2; exit 1;;
esac
exit 0
您将在您的存储库中包含此文件(确保chmod +x
或以其他方式使其可执行),并且他们将使用以下“魔术咒语”:
$ git clone <url>
$ cd <new-clone>
$ cp <path-to-file> .git/hooks/pre-commit
克隆时。但是,如果他们忘记执行cp
步骤,他们就不会有钩子。 (你可以给他们一个执行clone-and-install-hooks的脚本,或者一个更通用的脚本,为他们安装克隆后应该运行的钩子。你甚至可以用钩子设置一个模板目录 - 或者让他们做这个本身,在他们的系统上 - 然后使用git clone --template=<template-dir>
。)
意见提醒:整个想法最终都是徒劳的,因为那些知道自己在做什么的人可以很容易地解决你在这里所做的任何事情(例如git commit --no-verify
);对于那些知道自己在做什么的人来说,没有意义,因为分支名称无论如何基本上都没有意义。 1 对于那些完全无能为力的人,你不能自动提供 。因此,您所能做的就是向愿意采取行动的用户提供提示,但不了解他们正在采取的行动。
1 考虑一下,在我的名为master
的分支上进行多次提交后,我可以运行:
git branch -m master feature/xyz
将重命名我的master
改为我的feature/xyz
,然后:
git checkout master
创建一个新的master
,其上游为origin/master
;新master
指向与origin/master
相同的提交。然后:
git checkout feature/xyz
让我回到我的feature/xyz
。我的feature/xyz
现在可能将其上游设置为origin/master
,但也许这就是我想要的。
my 存储库中的分支名称在这里只是ephemera:我随意创建,重命名和/或销毁它们。什么是提交。对于您的服务器端分支来说情况并非如此:分支名称那里在克隆该存储库时会被复制到其他用户的远程跟踪名称中,而其他用户可能对分支名称和远程跟踪名称有效,因此这些名称做很重要。但是一旦你知道名字在Git中如何运作,它们只是为了方便,而且很容易改变。