This repository had a large subdirectory of large files that months ago I removed from the commit and that I now want to remove from the repo forever. The massive subdirectory is no longer in the download but the objects directory is enormous.

The checkouts/clones take a long time and I believe this is because of the large .git/objects directory.

    <files to keep>
        <massive subdirectory>

I want to remove the massive subdirectory.


The link above has a long discussion of a procedure that I've put to this script :


    if [ -z "$1" ]; then
      echo "missing argument: subdirectory to remove"

    git filter-branch --tree-filter 'rm -rf $1' --prune-empty HEAD
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
    echo $1/ >> .gitignore
    git add .gitignore
    git commit -m 'Removing $1 from git history'
    git gc
    git push origin master --force

I have run this without obvious errors and then cloned the repo to find that the .git/objects directory is not reduced in size.

Is the script missing something? Am I missing something? Has a recent version of git introduced a more direct feature for this requirement?

Is there another approach?

  • 1
    filter-branch is your answer; I don't have the details in front of me. May 7 '19 at 23:19

This answer using index-filter worked for me where the others did not :


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.