e0755a58af901c9a5f24b23f55a9780c5929c7b7 galt Thu Apr 29 02:05:28 2021 -0700 adding pre-commit hook to help users find out that the file is too big before they commit, not after they push. diff --git pre-commit-prevent-large-files.sh pre-commit-prevent-large-files.sh new file mode 100755 index 0000000..b2861a9 --- /dev/null +++ pre-commit-prevent-large-files.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# This is a pre-commit hook that ensures attempts to commit files that are +# larger than $limit to your _local_ repo fail, with a helpful error message. + +# Maximum file size limit in bytes +limit=$(( 2200000 )) # 2,2MB +limitInMB=$(( $limit / 2**20 )) + +# 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 +# `--diff-filter=d` -> skip deletions ACMRTUXB (everything but D) +# syntax since lower case filter only available in git version 2.10, we have 1.8.3.1 +# we do not care if deleted files are large or not, they are allowed. +for file in $( git diff-index --cached --diff-filter=ACMRTUXB --name-only "$against" ); do + # Skip for directories (git submodules) + if [[ -f "$file" ]]; then + file_size=$( ls -lan $file | awk '{ print $5 }' ) + if [ "$file_size" -gt "$limit" ]; then + echo File $file is $(( $file_size / 2**20 )) MB, which is larger than our configured limit of $limitInMB MB + shouldFail=true + fi + fi +done + +if $shouldFail +then + echo Commit aborted + exit 1; +fi