Bash script which will:
- Iterate all commits made within a Git repository.
- List every object at each commit.
- Order unique objects in descending size order.
Useful for removing large resources from a Git repository, for instance with migrations into GitHub where individual objects are limited to 100MB maximum.
$ ./gitlistobjectbysize.sh
100644 blob de6bdeaefebec0bff53d4859833caddba635609c 123452290 something/really/large.iso
100644 blob 946488f3c2ab8abf5d36b88f9018af77dceda12d 2290 path/to/script.js
100644 blob 2e234e61460f2fa087f9aebbfee2f6b524bc38fe 1724 README.md
100644 blob 1807d789603ae1038985f76c54e6de3b093da761 1710 README.md
100644 blob 7b5071e880f1abed9191fb34425157901c0a51a7 1083 LICENSE
100755 blob ef377e40d54365c814b9324ab4001455f4b5d4d8 651 bashscript.sh
100644 blob 08ca429f5434247f12f503dd69df244399d4ef83 19 .gitignore
100644 blob 8a52f946a9aed2c242cbe8891b3510f750527bb2 18 .gitignore
Note
For git
version 2.38.0
and above, the git ls-tree --format
argument will provide a more succinct report output, used via the gitlistobjectbysize-git2.38.0.sh
script variant.
If we now wish to remove something/really/large.iso
we can rewrite history using git filter-branch
:
$ git filter-branch \
--tree-filter "rm -f something/really/large.iso" \
-- --all
Ref 'refs/heads/main' was rewritten
I like this @Maxattax97 - probably at the point I'd convert this to a Python script... 😄