linuxgitgithubfilesize

How to limit file size on commit?


Is there an option to limit the file size when committing?

For example: file sizes above 500K would produce a warning. File sizes above 10M would stop the commit.

I'm fully aware of this question which technically makes this a duplicate but the answers only offer a solution on push, which would be too late for my requirements.


Solution

  • This pre-commit hook will do the file size check:

    .git/hooks/pre-commit

    #!/bin/sh
    hard_limit=$(git config hooks.filesizehardlimit)
    soft_limit=$(git config hooks.filesizesoftlimit)
    : ${hard_limit:=10000000}
    : ${soft_limit:=500000}
    
    list_new_or_modified_files()
    {
        git diff --staged --name-status|sed -e '/^D/ d; /^D/! s/.\s\+//'
    }
    
    unmunge()
    {
        local result="${1#\"}"
        result="${result%\"}"
        env echo -e "$result"
    }
    
    check_file_size()
    {
        n=0
        while read -r munged_filename
        do
            f="$(unmunge "$munged_filename")"
            h=$(git ls-files -s "$f"|cut -d' ' -f 2)
            s=$(git cat-file -s "$h")
            if [ "$s" -gt $hard_limit ]
            then
                env echo -E 1>&2 "ERROR: hard size limit ($hard_limit) exceeded: $munged_filename ($s)"
                n=$((n+1))
            elif [ "$s" -gt $soft_limit ]
            then
                env echo -E 1>&2 "WARNING: soft size limit ($soft_limit) exceeded: $munged_filename ($s)"
            fi
        done
    
        [ $n -eq 0 ]
    }
    
    list_new_or_modified_files | check_file_size
    

    Above script must be saved as .git/hooks/pre-commit with execution permissions enabled (chmod +x .git/hooks/pre-commit).

    The default soft (warning) and hard (error) size limits are set to 500,000 and 10,000,000 bytes but can be overriden through the hooks.filesizesoftlimit and hooks.filesizehardlimit settings respectively:

    $ git config hooks.filesizesoftlimit 100000
    $ git config hooks.filesizehardlimit 4000000