有三种方式可以消除commit,但是都无法彻底删除相应文件空间: git reset, git revert, git rebase -i

关于删除空间,可以先查看哪些文件占的空间较大:

1
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

然后删除对应的文件

1
2
3
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch ___bigfile___' \
--prune-empty --tag-name-filter cat -- --all

再彻底从commit中抹掉该文件的记录:

1
2
3
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

最后提交到远程:

1
2
git push --force --verbose --dry-run
git push --force