Bitbucket:仅通过分支工作流上的拉取请求强制合并

时间:2015-03-20 21:05:19

标签: mercurial push bitbucket

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

我们喜欢什么:能够限制一些人无法通过命令行推送到default分支(以避免意外提交到该分支)。即 - 我们希望强制执行它,以便通过拉取请求修改default的唯一方法。

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

Branch Restrictions似乎很有希望,虽然我们可以设置任何人都无法通过命令行推送,但这意味着只有一个命名用户或组可以实际合并PR(我们不会# 39; t want,理想情况下,团队中的任何人都可以合并,只需通过Bitbucket PR)。

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

1 个答案:

答案 0 :(得分:1)

所以我最终用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上挂钩。