Prevent commits in master branch Prevent commits in master branch git git

Prevent commits in master branch


Yes, it is possible. You must create pre-commit hook which rejects commits to master branch. Git doesn't call pre-commit hook when you call merge command, so this hook will be rejecting only regular commits.

  1. Go to your repository.
  2. Create file .git/hooks/pre-commit with following content:

    #!/bin/shbranch="$(git rev-parse --abbrev-ref HEAD)"if [ "$branch" = "master" ]; then  echo "You can't commit directly to master branch"  exit 1fi
  3. Make it executable (not required on Windows):

    $ chmod +x .git/hooks/pre-commit

To disable fast-forward merges you must also add following option to your .git/config file:

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

If you want also protect master branch on your remote, check this answer: How to restrict access to master branch on git


You can use the pre-commit utility to do this. It has a built in no-commit-to-branch hook that can be used to prevent commits to one or more branches.

Setup

The basic setup process is:

  • Install using pip or brew (instructions at https://pre-commit.com/#install)
  • Create a .pre-commit-config.yaml file in the root of your project (see below for a first draft)
  • Install the hooks into your git config by running pre-commit install.

Basic config for protecting branches

Here is a basic config that includes just the no-commit-to-branch hook:

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

If you want to protect multiple branches you can use include multiple --branch args in the argument list:

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']

Isn't this all overkill?

Pre-commit has many other built-in hooks, and a large collection of community-built hooks that will transform the way you clean-up and validate your commits. The reason I mention this is because, while this tool may be overkill for just preventing commits to a protected branch, it has many other features that make it a compelling and simple addition to any git project.


It may make sense to install it globally via

git config --global core.hooksPath ~/githooks

and moving that pre-commit file into that directory