Create a gist now

Instantly share code, notes, and snippets.

Git pre-commit check to stop accidental commits to master and develop branches. There is also a variant with a core.whitespace check.
#!/bin/sh
# This script will install a Git pre-commit hook that stop accidental commits to master and develop branches.
# There is also a variant that includes a core.whitespace check. See pre-commit-2 below.
# Install in current Git repo:
# curl -fL https://gist.githubusercontent.com/stefansundin/9059706/raw/install-pre-commit.sh | sh
# Install with core.whitespace check:
# curl -fL https://gist.githubusercontent.com/stefansundin/9059706/raw/install-pre-commit.sh | sh -s pre-commit-2
# Install with core.whitespace check and EOF-newline-check:
# curl -fL https://gist.githubusercontent.com/stefansundin/9059706/raw/install-pre-commit.sh | sh -s pre-commit-3
# Install only core.whitespace check:
# curl -fL https://gist.githubusercontent.com/stefansundin/9059706/raw/install-pre-commit.sh | sh -s pre-commit-3
# Uninstall:
# rm .git/hooks/pre-commit
# in each repository that you've added this to.
GITROOT=`git rev-parse --show-toplevel 2> /dev/null`
echo
echo
if [ "$GITROOT" == "" ]; then
echo This does not appear to be a git repo.
exit 1
fi
if [ -f "$GITROOT/.git/hooks/pre-commit" ]; then
echo There is already a pre-commit hook installed. Delete it first.
echo
echo " rm '$GITROOT/.git/hooks/pre-commit'"
echo
exit 2
fi
FILE=${1:-pre-commit}
echo Downloading $FILE hook from https://gist.github.com/stefansundin/9059706
echo
curl -fL -o "$GITROOT/.git/hooks/pre-commit" "https://gist.githubusercontent.com/stefansundin/9059706/raw/$FILE"
if [ ! -f "$GITROOT/.git/hooks/pre-commit" ]; then
echo Error downloading pre-commit script!
exit 3
fi
chmod +x "$GITROOT/.git/hooks/pre-commit"
echo "You're all set! Happy hacking!"
exit 0
#!/bin/bash
# Stops accidental commits to master and develop. https://gist.github.com/stefansundin/9059706
# Install:
# cd path/to/git/repo
# curl -fL -o .git/hooks/pre-commit https://gist.githubusercontent.com/stefansundin/9059706/raw/pre-commit
# chmod +x .git/hooks/pre-commit
BRANCH=`git rev-parse --abbrev-ref HEAD`
if [[ "$BRANCH" == "master" || "$BRANCH" == "develop" ]]; then
echo "You are on branch $BRANCH. Are you sure you want to commit to this branch?"
echo "If so, commit with -n to bypass this pre-commit hook."
exit 1
fi
exit 0
#!/bin/bash
# Stops accidental commits to master and develop. https://gist.github.com/stefansundin/9059706
# Install:
# cd path/to/git/repo
# curl -fL -o .git/hooks/pre-commit https://gist.githubusercontent.com/stefansundin/9059706/raw/pre-commit-2
# chmod +x .git/hooks/pre-commit
BRANCH=`git rev-parse --abbrev-ref HEAD`
if [[ "$BRANCH" == "master" || "$BRANCH" == "develop" ]]; then
echo "You are on branch $BRANCH. Are you sure you want to commit to this branch?"
echo "If so, commit with -n to bypass this pre-commit hook."
exit 1
fi
if [ "`git diff --check --cached | wc -c`" -gt 0 ]; then
echo "Your spaces don't agree with your core.whitespace rules."
echo 'Please run `git diff --check HEAD` to see your errors.'
echo "You can commit with -n to bypass this pre-commit hook."
exit 2
fi
exit 0
#!/bin/bash
# Stops accidental commits to master and develop. https://gist.github.com/stefansundin/9059706
# Install:
# cd path/to/git/repo
# curl -fL -o .git/hooks/pre-commit https://gist.githubusercontent.com/stefansundin/9059706/raw/pre-commit-3
# chmod +x .git/hooks/pre-commit
BRANCH=`git rev-parse --abbrev-ref HEAD`
if [[ "$BRANCH" == "master" || "$BRANCH" == "develop" ]]; then
echo "You are on branch $BRANCH. Are you sure you want to commit to this branch?"
echo "If so, commit with -n to bypass this pre-commit hook."
exit 1
fi
if [ "`git diff --check --cached | wc -c`" -gt 0 ]; then
echo "Your spaces don't agree with your core.whitespace rules."
echo 'Please run `git diff --check HEAD` to see your errors.'
echo "You can commit with -n to bypass this pre-commit hook."
exit 2
fi
NOEOF=()
FILES=`git status --porcelain | grep "^M" | cut -b4-`
while read -r f; do
if [ "`tail -c 1 $f`" != "" ]; then
NOEOF+=("$f")
fi
done <<< "$FILES"
if [ ${#NOEOF[@]} -gt 0 ]; then
echo "No newlines at the end of these files:"
for f in "${NOEOF[@]}"; do
echo " $f"
done
echo
echo "To check your whole repository, run this:"
echo
echo ' git ls-tree -r -z --name-only HEAD | xargs -0 file | grep text | cut -d: -f1 | xargs -I {} bash -c '\''if [ -n "`tail -c 1 "{}"`" ]; then echo {}; fi'\'''
echo
echo "You can commit with -n to bypass this pre-commit hook."
exit 3
fi
exit 0
#!/bin/bash
# Checks yo whitespace on commit. https://gist.github.com/stefansundin/9059706
# Install:
# cd path/to/git/repo
# curl -fL -o .git/hooks/pre-commit https://gist.githubusercontent.com/stefansundin/9059706/raw/pre-commit-4
# chmod +x .git/hooks/pre-commit
BRANCH=`git rev-parse --abbrev-ref HEAD`
if [ "`git diff --check --cached | wc -c`" -gt 0 ]; then
echo "Your spaces don't agree with your core.whitespace rules."
echo 'Please run `git diff --check HEAD` to see your errors.'
echo "You can commit with -n to bypass this pre-commit hook."
exit 2
fi
exit 0
@mmcdaris

Thanks! This is great 👍

@martin-klima

Thank you! Very useful.

@EerdeBruining

Thanks!

@satishksuryawanshi

Thanks a lot

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment