我有一个想法是通过在GIT更新挂钩中使用锁定脚本来锁定用户将文件推入其中的存储库,因为推送只能将userid识别为参数而不是分支。所以我可以锁定刚刚锁定目录的整个仓库。
有没有办法在GIT中锁定特定的分支?
或者,Update Hook是否可以识别用户正在推送的分支以及推送代码的分支?
答案 0 :(得分:38)
被推送的分支是update hook的第一个参数。如果您想锁定分支myfeature
以进行推送,则此代码(放在hooks/update
中)将执行此操作:
#!/bin/sh
# lock the myfeature branch for pushing
refname="$1"
if [[ $refname == "refs/heads/myfeature" ]]
then
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
echo "You cannot push to myfeature! It's locked"
echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
exit 1
fi
exit 0
答案 1 :(得分:9)
更新挂钩,来自docs:
钩子为每个ref更新执行一次,并采用三个参数:
- 要更新的ref的名称,
- 存储在ref中的旧对象名称
- 以及要存储在ref。
中的新对象名
所以......是的,它确切知道正在推送什么分支,并且可以简单地检查该参数并退出失败,如果它不希望分支被推送到。
如果您希望(智能地)在用户上传对象之前执行此操作,您可以使用预接收挂钩:
此挂钩执行一次以进行接收操作。它不需要参数,但是对于每个ref都要更新它在标准输入上接收格式的一行:
<old-value>
SP<new-value>
SP<ref-name>
LF其中
<old-value>
是存储在ref中的旧对象名称,<new-value>
是要存储在ref中的新对象名称,<ref-name>
是ref的全名。
(那些是空格和换行)
答案 2 :(得分:7)
像gitolite这样的工具我相信这种功能:http://github.com/sitaramc/gitolite
答案 3 :(得分:1)
您可以使用pre-commit来执行此操作。它具有内置的no-commit-to-branch
挂钩,可用于防止提交到一个或多个分支。
基本设置过程为:
.pre-commit-config.yaml
文件(初稿请参见下文)pre-commit install
将钩子安装到git配置中。这是一个基本配置,仅包含no-commit-to-branch
钩子:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.2.5
hooks:
- id: no-commit-to-branch
args: ['--branch', 'master']
如果要保护多个分支,可以使用在参数列表中包括多个--branch
参数:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.2.5
hooks:
- id: no-commit-to-branch
args: ['--branch', 'master', '--branch', 'staging']
预提交还有许多其他built-in hooks, and a large collection of community-built hooks,它们将改变您清理和验证提交的方式。我之所以提到它,是因为虽然该工具可能只是阻止阻止提交到受保护的分支而过分杀伤,但它具有许多其他功能,使其成为任何git项目的引人注目且简单的添加。