阻止开发人员创建新的 git 个远程分支
Prevent developers from creating new git remote branches
在集中式工作流中,是否有任何方法(通过本地或服务器配置)阻止开发人员在 git 中创建新的远程分支?
我们很高兴创建本地分支机构,但有时这个本地 spikes
或 test-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
在集中式工作流中,是否有任何方法(通过本地或服务器配置)阻止开发人员在 git 中创建新的远程分支?
我们很高兴创建本地分支机构,但有时这个本地 spikes
或 test-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