我想限制某些用户将变更集推送到存储库的默认分支。如果有可能,你会怎么做?
2 回答
ACL 扩展应该适合您。但是,您需要考虑以下注意事项:
必须在服务器存储库中启用扩展。也就是说,
hgrc
每个服务存储库的文件都应该定义 ACL 设置:[extensions] acl = [hooks] pretxnchangegroup.acl = python:hgext.acl.hook [acl] sources = serve [acl.deny.branches] default = user1, user2, user3
这些拒绝推送的用户是系统用户。也就是说,在您的情况下,用户名取自 Web 服务器提供的凭据。它与提交元数据中的字段无关。
Author:
- 您只能允许或拒绝完整的 chagegroups。如果您的一个被拒绝的用户将一组包含单个提交的提交推送到默认分支,则整个推送将被拒绝(即使其他提交被允许)。如果您的用户倾向于经常与默认分支合并,这并不奇怪。
您也可以编写自己的pretxnchangegroup
钩子,但您不会比 ACL 扩展更有能力。
当前答案将在您推送时检查(并且检查是服务器端,就像我从 acl 代码中组成的那样)。您想要的是检查对本地存储库的提交。为此,您应该制作一个“pretxncommit”-hook(注意有多种钩子作用于不同的事件)。
请执行下列操作:
根据一个成功的 Git 分支模型,master 上不应该有直接提交,只有合并。为了强加这一点,我们可以向 mercurial 添加一个回调钩子来检查提交,如果它们直接在 master 上,则禁止它们。为此,在项目的 .hg/hgrc 中添加以下代码行:
[hooks]
pretxncommit.nocommittomasterhook = python:%USERPROFILE%\hgnocommittomaster.py:nocommittomaster
在您的 Windows 主目录中创建hgnocommittomaster.py
包含内容的文件“”(原始示例):
from mercurial.node import bin, nullid
from mercurial import util
# Documentation is here: https://www.mercurial-scm.org/wiki/MercurialApi
# Script based on: https://www.mercurial-scm.org/wiki/HookExamples
def nocommittomaster(ui, repo, node, **kwargs):
n = bin(node)
start = repo.changelog.rev(n)
end = len(repo.changelog)
failed = False
for rev in xrange(start, end):
n = repo.changelog.node(rev)
ctx = repo[n]
p = ctx.parents()
if ctx.branch() == 'master' and len(p) == 1:
if p[0].branch() != 'master':
# commit that creates the branch, allowed
continue
if len(ctx.files()) == 0 and len(ctx.tags()) == 1: # will not hit?, '.hgtags' always changed?
continue # Only a tag is added; allowed.
elif len(ctx.files()) == 1 and len(ctx.tags()) == 1:
if ctx.files()[0] == '.hgtags':
continue # Only a tag is added; allowed.
ui.warn(' - changeset rev=%d (%s) on stable branch and is not a merge !\n' % (rev,ctx))
failed = True
if failed:
ui.warn('* Please strip the offending changeset(s)\n'
'* and re-do them, if needed, on another branch!\n')
return True
这篇文章的灵感来自:Mercurial pre-commit hook和Mercurial Pre-Commit Hook: How to hook to python program in current directory?