Last active
September 5, 2024 06:50
pre-commit hook to prevent large file on git commit (and allow git-lfs tracked binary files to pass through)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/sh | |
# | |
# An example hook script to verify what is about to be committed. | |
# Called by "git commit" with no arguments. The hook should | |
# exit with non-zero status after issuing an appropriate message if | |
# it wants to stop the commit. | |
# | |
# To enable this hook, rename this file to "pre-commit". | |
# Redirect output to stderr. | |
exec 1>&2 | |
FILE_SIZE_LIMIT_KB=1024 | |
CURRENT_DIR="$(pwd)" | |
COLOR='\033[01;33m' | |
NOCOLOR='\033[0m' | |
HAS_ERROR="" | |
COUNTER=0 | |
# generate file extension filter from gitattributes for git-lfs tracked files | |
filter=$(cat .gitattributes | grep filter=lfs | awk '{printf "-e .%s$ ", $1}') | |
# before git commit, check non git-lfs tracked files to limit size | |
files=$(git diff --cached --name-only | sort | uniq | grep -v $filter) | |
while read -r file; do | |
if [ "$file" = "" ]; then | |
continue | |
fi | |
file_path=$CURRENT_DIR/$file | |
file_size=$(ls -l "$file_path" | awk '{print $5}') | |
file_size_kb=$((file_size / 1024)) | |
if [ "$file_size_kb" -ge "$FILE_SIZE_LIMIT_KB" ]; then | |
echo "${COLOR}${file}${NOCOLOR} has size ${file_size_kb}KB, over commit limit ${FILE_SIZE_LIMIT_KB}KB." | |
HAS_ERROR="YES" | |
((COUNTER++)) | |
fi | |
done <<< "$files" | |
# exit with error if any non-lfs tracked files are over file size limit | |
if [ "$HAS_ERROR" != "" ]; then | |
echo "$COUNTER files are larger than permitted, please fix them before commit" >&2 | |
exit 1 | |
fi | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Instead of manually parsing
.gitattributes
, there is alsogit check-attr
, which is less error prone to use and also works with bare repositories.