阻止开发人员创建新的 git 个远程分支

Prevent developers from creating new git remote branches

在集中式工作流中,是否有任何方法(通过本地或服务器配置)阻止开发人员在 git 中创建新的远程分支?

我们很高兴创建本地分支机构,但有时这个本地 spikestest-feature 分支机构会错误地转到远程。

有什么方法可以避免这种情况而不进入更受限制的工作流程?

您使用什么 git 服务器?

gitolite中,例如,您可以根据branch/tag名称和用户"login"设置ACL(参见文档here

您可以在服务器中使用挂钩,因此将扫描推送并拒绝任何新分支。

将此挂钩放在共享存储库的 "hooks" 文件夹中(脚本应命名为 "update")

#!/bin/env python
"""
Server side hook that checks if a branch being pushed already exists and rejects
the commit if not

It prevents the creation of new branches in a shared repository
"""

import sys
import os

branch_id = sys.argv[1]

# Tag pushes are not blocked
if branch_id.startswith('refs/tags'):
    exit(0)
elif not os.path.exists(branch_id):
    print("You are not allowed to create new branches")
    exit(1)

检查 this link 以获取有关 git 强制执行政策的更多信息

编辑: 根据 jthill 的反馈,有一个替代实现,而不是搜索分支 ref 文件,主动详细说明现有分支列表 (可以通过调用管道命令而不是调用 "git branch" 正如我在这里做的那样)

#!/bin/env python

import sys
import os
from subprocess import check_output


def tags():
    return [i.lstrip(' *') for i in check_output(["git", "branch"]).split('\n') if i!='']


def main():
    branch_id = sys.argv[1]

    # Only ref/heads are being processed
    if branch_id.startswith('refs/heads/'):
        if not branch_id.lstrip('refs/heads/') in tags():
            exit(1)

if __name__ == '__main__':
    main()

.git/hooks/pre-receive

#!/bin/sh
rc=0
while read old new refname; do
        if [[ $refname == refs/heads/* && $old != *[^0]* ]]; then
                rc=1
                echo "Refusing to create new branch $refname"
        fi
done
exit $rc