我有一个想法,可以通过在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
更新挂钩,来自文档:
该挂钩对每个要更新的引用执行一次,并采用三个参数:
- 正在更新的引用的名称,
- 存储在引用中的旧对象名称,
- 和要存储在引用中的新对象名。
所以...是的,它确切知道要推送的分支,并且如果不希望将分支推送到该参数,可以简单地检查该参数并退出失败。
并且如果您要(智能地)执行此操作[[之前用户已上传对象,则可以使用预接收钩子:
此挂钩对接收操作执行一次。它不带任何参数,但是对于每个要更新的引用,它在标准输入上会收到以下格式的行:[
<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配置中。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']
难道这不是全部吗?Pre-commit具有许多其他built-in hooks, and a large collection of community-built hooks,它们将改变您清理和验证提交的方式。我之所以提到这个原因是因为,尽管该工具可能只是为了防止提交受保护的分支而过分杀人,但它还有许多其他功能,使其成为任何git项目的引人注目的和简单的添加。