Git:阻止master分支中的提交

时间:2016-11-07 09:47:43

标签: git merge fast-forward

(为简单起见)我的Git-repo中有master分支和dev。 我想确保master分支始终有效,因此我所做的所有工作都应该在dev分支中。

然而,当我将我的更改与--no-ff合并合并时,我倾向于留在master分支中,并继续在其中工作(因为我忘了查看我的{{1}分支)。

我可以为dev分支建立一个规则,它表示我不能做提交,快进合并,但只有master从另一个分支合并?

这必须适用于私有托管存储库(而不是GitHub和BitBucket)。

3 个答案:

答案 0 :(得分:83)

是的,有可能。您必须创建预提交挂钩,拒绝提交到主分支。当你调用 merge 命令时,Git不会调用pre-commit钩子,所以这个钩子只会拒绝常规提交。

  1. 转到您的存储库。
  2. 使用以下内容创建文件 .git / hooks / pre-commit

    #!/bin/sh
    
    branch="$(git rev-parse --abbrev-ref HEAD)"
    
    if [ "$branch" = "master" ]; then
      echo "You can't commit directly to master branch"
      exit 1
    fi
    
  3. 使其可执行( Windows 上不需要):

    $ chmod +x .git/hooks/pre-commit
    
  4. 要禁用快进合并,您还必须在 .git / config 文件中添加以下选项:

    [branch "master"]
        mergeoptions = --no-ff
    

    如果您还希望保护遥控器上的主分支,请选中以下答案:How to restrict access to master branch on git

答案 1 :(得分:11)

您可以使用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: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master']

如果要保护多个分支,可以使用在参数列表中包括多个--branch参数:

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v3.3.0
  hooks:
    - id: no-commit-to-branch
      args: ['--branch', 'master', '--branch', 'staging']

这不是全部杀了吗?

预提交还有许多其他built-in hooks, and a large collection of community-built hooks,它们将改变您清理和验证提交的方式。我之所以提到它,是因为虽然该工具可能只是阻止阻止提交到受保护的分支而过分杀伤,但它具有许多其他功能,使其成为任何git项目的引人注目且简单的添加。

答案 2 :(得分:2)

通过以下方式进行全局安装可能很有意义

git config --global core.hooksPath ~/githooks

并将该pre-commit文件移动到该目录