Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save danmackinlay/6e4a0e5c38a43972a0de2938e6ddadba to your computer and use it in GitHub Desktop.

Select an option

Save danmackinlay/6e4a0e5c38a43972a0de2938e6ddadba to your computer and use it in GitHub Desktop.
Git pre-commit hook for large files

You can use in two ways.

  1. Directly as the pre-commit hook in your .git/hooks folder.

  2. With Husky by updating your package.json with:

"husky": {
    "hooks": {
      "pre-commit": "sh ./some-path/pre-commit-prevent-large-files.sh"
    }
}

Based on @kiwidamien's original gist here

#!/bin/sh
# This is a pre-commit hook that ensures attempts to commit files that are
# are larger than $limit to your _local_ repo fail, with a helpful error message.
# Maximum file size limit in bytes
limit=5000000 # 5MB
limitInMB=$(( $limit / 10**6 ))
# Move to the repo root so git files paths make sense
repo_root=$( git rev-parse --show-toplevel )
cd $repo_root
empty_tree=$( git hash-object -t tree /dev/null )
if git rev-parse --verify HEAD > /dev/null 2>&1
then
against=HEAD
else
against=empty_tree
fi
# Set split so that for loop below can handle spaces in file names by splitting on line breaks
IFS='
'
echo "Checking staged file sizes"
shouldFail=false
for file in $( git diff-index --cached --name-only $against ); do
file_size=$( ls -la $file | awk '{ print $5 }')
if [ "$file_size" -gt "$limit" ]; then
echo File $file is $(( $file_size / 10**6 )) MB, which is larger than our configured limit of $limitInMB MB
shouldFail=true
fi
done
if $shouldFail
then
echo If you really need to commit this file, you can push with the --no-verify switch, but the file should definitely, definitely be under 10MB!!!
echo Commit aborted
exit 1;
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment