Very useful for removing unwanted files in a git repository. Cloning a 1GB repository because someone accidentally committed in a video.
# How To Completely Remove a File From Git History
#
# by: Marius Ducea
# http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/
# First we need to identify the file that is causing this issue; and for
# this we will verify all the packed objects and look for the biggest ones:
git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5
# (and grab the revisions with the biggest files). Then find the name of the
# files in those revisions:
git rev-list --objects --all | grep <revision_id>
# Next, remove the file from all revisions:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <filename>'
rm -rf .git/refs/original/
# Edit ".git/packed-refs" and remove/comment any external pack-refs.
# Without this the cleanup might not work. I my case I had
# "refs/remotes/origin/master" and some others branches.
vim .git/packed-refs
# Finally repack and cleanup and remove those objects:
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
# Hopefully these steps will help you completely remove those un-wanted
# files from your git history. Let me know if you have any problems after
# following these simple steps.
# Note: if you want to test these steps here is how to
# quickly create a "test" repo:
# Make a small repo
mkdir test
cd test
git init
echo hi > there
git add there
git commit -m 'Small repo'
# Add a random 10M binary file
dd if=/dev/urandom of=testme.txt count=10 bs=1M
git add testme.txt
git commit -m 'Add big binary file'
# Remove the 10M binary file
git rm testme.txt
git commit -m 'Remove big binary file'