是否有一种方法可以在GIT中锁定分支

问题描述 投票:42回答:4

我有一个想法,可以通过在GIT更新挂钩中添加一个锁定脚本来锁定用户将文件推送到存储库中,因为该推送只能将userid识别为参数,而不是分支。因此,我可以锁定仅锁定目录的整个存储库。

是否可以在GIT中锁定特定分支?

或者有没有一种更新挂钩可以识别用户从哪个分支推送代码以及将代码推送到哪个分支?

git git-branch
4个回答
42
投票

被推送到的分支是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

9
投票

更新挂钩,来自文档:

该挂钩对每个要更新的引用执行一次,并采用三个参数:

  • 正在更新的引用的名称,
  • 存储在引用中的旧对象名称,
  • 和要存储在引用中的新对象名。

所以...是的,它确切知道要推送的分支,并且如果不希望将分支推送到该参数,可以简单地检查该参数并退出失败。

并且如果您要(智能地)执行此操作[[之前用户已上传对象,则可以使用预接收钩子:

此挂钩对接收操作执行一次。它不带任何参数,但是对于每个要更新的引用,它在标准输入上会收到以下格式的行:

[<old-value> SP<new-value>SP<ref-name>LF

其中<old-value>是保存在引用中的旧对象名称,<new-value>是要保存在引用中的新对象名称,<ref-name>是引用的全名。

(那些是空格和换行符)


7
投票
我相信像甘蔗石这样的工具具有这种功能:http://github.com/sitaramc/gitolite

0
投票
您可以使用pre-commit执行此操作。它具有内置的no-commit-to-branch挂钩,可用于防止提交到一个或多个分支。

设置

基本设置过程是:

    使用pip或brew安装(https://pre-commit.com/#install上的说明]
  • 在项目的根目录中创建.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项目的引人注目的和简单的添加。

  • © www.soinside.com 2019 - 2024. All rights reserved.