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