I tried looking for a good tutorial on reducing git repository sizes, but I found none.
How do I reduce my repository size?
It's about 10 MB, but Heroku only allows 50 MB
and I'm nowhere near finished developing my application.
I added the usual suspects (log, vendor, doc, etc.) to the .gitignore file already.
Although I only added .gitignore recently.
What can I do?
Update Feb. 2021, eleven years later: the new git maintenance
command (man page) should supersede git gc
, and can be scheduled.
Original: git gc --aggressive
is one way to force the prune process to take place (to be sure: git gc --aggressive --prune=now
). You have other commands to clean the repo too. Don't forget though, sometimes git gc
alone can increase the size of the repo!
It can be also used after a filter-branch
, to mark some directories to be removed from the history (with a further gain of space); see here. But that means nobody is pulling from your public repo. filter-branch
can keep backup refs in .git/refs/original
, so that directory can be cleaned too.
Finally, as mentioned in this comment and this question; cleaning the reflog can help:
git reflog expire --all --expire=now
git gc --prune=now --aggressive
An even more complete, and possibly dangerous, solution is to remove unused objects from a git repository
Note that git filter-repo
now (Git 2.24+, Q4 2019) replaces the obsolete git filter-branch
or BFG: it is a python-based tool, to be installed first.
# Find the largest files in .git:
git rev-list --objects --all | grep -f <(git verify-pack -v .git/objects/pack/*.idx| sort -k 3 -n | cut -f 1 -d " " | tail -10)
# Strat filtering these large files:
git filter-repo --path-glob '../../src/../..' --invert-paths --force
#or
git filter-repo --path-glob '*.zip' --invert-paths --force
#or
git filter-repo --path-glob '*.a' --invert-paths --force
git remote add origin git@github.com:.../...git
git push --all --force
git push --tags --force