我有一个锁定Git仓库的想法,可以在GIT更新钩子中使用锁定脚本来阻止用户将文件推入其中,因为推送只能识别userid作为参数而不是分支。因此,我可以锁定整个仓库,也就是锁定一个目录。
是否有一种方法可以锁定Git中的特定分支?
或者,是否有一种方法可以让更新钩子识别用户正在从哪个分支推送代码以及向哪个分支推送代码?
我有一个锁定Git仓库的想法,可以在GIT更新钩子中使用锁定脚本来阻止用户将文件推入其中,因为推送只能识别userid作为参数而不是分支。因此,我可以锁定整个仓库,也就是锁定一个目录。
是否有一种方法可以锁定Git中的特定分支?
或者,是否有一种方法可以让更新钩子识别用户正在从哪个分支推送代码以及向哪个分支推送代码?
被推送的分支是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
该钩子对于每个要更新的引用执行一次,需要三个参数:
- 正在更新的引用名称,
- 存储在引用中的旧对象名称,
- 将存储在引用中的新对象名称。
所以……确实,它知道正在推送哪个分支,并且可以简单地检查该参数并在不想将分支推送到时失败退出。
如果您想要在用户上传对象之前(聪明地)执行此操作,则可以使用pre-receive钩子:
该钩子对于每个接收操作执行一次。 它不需要参数,但对于要更新的每个引用,它会在标准输入上接收格式为以下一行的行:
<old-value>
SP<new-value>
SP<ref-name>
LF其中
<old-value>
是存储在引用中的旧对象名称,<new-value>
是要存储在引用中的新对象名称,而<ref-name>
则是引用的完整名称。
(这些是空格和换行符)
no-commit-to-branch
钩子,可用于防止将提交推送到一个或多个分支。.pre-commit-config.yaml
文件(如下所示)pre-commit install
将钩子安装到你的 git 配置中。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']
Pre-commit还有许多其他内置的钩子,以及大量由社区构建的钩子,它们都能改善您清理和验证提交的方式。我提到这一点的原因是,虽然这个工具可能对于仅防止向受保护分支提交而言有些过头,但它还具有许多其他功能,使它成为任何git项目中引人注目且简单易用的补充。