Bitbucket:通过对分支工作流程的拉取请求强制执行仅合并

Bitbucket: Enforce merge-only by pull request on branch workflow

我们的团队使用 Bitbucket 来托管我们的 Mercurial 存储库。我们有一个存储库,在配置它们时克隆到我们的开发 VM。我们使用相当典型的功能分支 -> 拉取请求 -> 审查 -> 将功能合并到 PR 工作流程中的 default

我们想要什么:能够限制一些事情,使得人们不能通过命令行推送到 default 分支(以避免意外提交到该分支)。即 - 我们想要强制执行它,以便修改 default 的唯一方法是通过拉取请求。

请注意,由于 VM 设置,分叉并不是一个真正的选项(我们必须增加 VM 配置的复杂性才能进行分叉,并在配置的 VM 上设置所有这些,即使那样只是意味着当有人不小心推到 default 他们只是弄乱了他们的叉子)。

Branch Restrictions 看起来很有前途,虽然我们可以将其设置为没有人可以通过命令行推送,但这意味着只有一个指定的用户或组可以进行 PR 的实际合并(我们不想,理想情况下团队中的任何人都可以合并,只需通过 Bitbucket PR)。

这可能吗?有什么建议吗?

所以我最终用 Mercurial 钩子解决了这个问题。具体来说,我创建了以下文件,我将其命名为 prevent_default_push.py 并放在我克隆的 .hg 目录中。

# branches to prevent being pushed to by command line.
# Separate branches by spaces
restricted_branches = "default".lower().split()

def branch_name(repo):
    return repo[None].branch().lower()

def is_restricted(branch):
    return branch in restricted_branches

def prevent_default(ui, repo, *args, **kwargs):
    if is_restricted(branch_name(repo)): 
        print("Preventing push to default branch")
        return True
    return False

def prevent_commit(ui, repo, *args, **kwargs):
    branch = branch_name(repo)
    if is_restricted(branch): 
        print("You're on a restricted branch (%s), are you sure you want to commit? [YN]" % branch)
        res = raw_input().strip().lower()
        return res != "y"
    return False

然后编辑 .hg/hgrc 文件以使用这些挂钩:

[hooks]
pre-push = python:.hg/prevent_default_push.py:prevent_default 
pre-commit = python:.hg/prevent_default_push.py:prevent_commit

然后当尝试在 default 分支上进行提交时,您会收到确认提示,如果您尝试向 default 进行推送,则会直接被拒绝。

示例运行:

$ hg commit
You're on a restricted branch (default), are you sure you want to commit? [YN]
n
abort: pre-commit hook failed

其中 "n" 是我输入的内容。

这样做的好处是,虽然 .hg 目录中的内容不受版本控制(因此克隆不会得到它),但我们可以将以下自动化合并到我们的供应机制中将这些挂钩放在已配置的 VM 上。