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

阻止开发人员创建新的git远程分支,git,git-branch,Git,Git Branch,在集中式工作流中,是否有任何方法(通过本地或服务器配置)阻止开发人员在git中创建新的远程分支 我们很乐意创建本地分支,但有时此本地峰值或测试功能分支会错误地转到远程 有什么方法可以避免这种情况而不使用更严格的工作流?您使用的是什么git服务器 例如,在gitolite中,您可以根据分支/标记名称和用户“登录”(参见文档)设置ACL您可以在服务器中使用钩子,因此推送将被扫描,任何新分支都将被拒绝 将此挂钩放在共享存储库的“挂钩”文件夹中(脚本应命名为“更新”) 检查有关git强制策略的更多信息

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

我们很乐意创建本地分支,但有时此本地
峰值
测试功能
分支会错误地转到远程


有什么方法可以避免这种情况而不使用更严格的工作流?

您使用的是什么git服务器


例如,在
gitolite
中,您可以根据分支/标记名称和用户“登录”(参见文档)设置ACL

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

将此挂钩放在共享存储库的“挂钩”文件夹中(脚本应命名为“更新”)

检查有关git强制策略的更多信息

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


.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

您可以让开发人员使用repo的fork并从各自的fork提交pull请求谢谢@ErikSvedin,但我不想像我在问题开始时所说的那样更改我们的流程。这将在任何具有打包引用的存储库上失败。通常,
git pack refs
用于打包标记(钩子没有检查这些标记)但不是树枝。尽管如此,我还是要为这种情况添加一个替代实现,即使用
--all
参数调用
git pack refs
来打包存储库。有人能解释regex*[^0]*的含义吗?@Setafire它不是regex,而是shell模式。它是“任何在某处有非-0”的东西”,因此不匹配意味着
$old
都是“0”,比
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000!我曾经编写过bashshell脚本,但从未遇到过这种情况。你能指出一些参考资料吗?那么,如果我必须为以开头的旧名称指定某个匹配项,该怎么办?比方说,我想检查以“F”开头的旧名称。我很难通过git完成这项工作。
#!/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()
#!/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