(已解决,见问题正文底部)
找这个很久了,到现在我有的是:
- http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ 和
- http://progit.org/book/ch9-7.html
几乎相同的方法,但它们都将对象留在包文件中......卡住了。
我尝试了什么:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc
包里还有文件,我是这样知道的:
git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3
和这个:
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all && git gc --aggressive --prune
相同...
尝试过git clone
的技巧,它删除了一些文件(其中约 3000 个),但最大的文件仍然存在......
我在存储库中有一些大型遗留文件,~200M,我真的不希望它们在那里......而且我不想将存储库重置为 0 :(
解决方案:这是摆脱文件的最短方法:
- 检查 .git/packed-refs - 我的问题是我有
refs/remotes/origin/master
一行远程存储库,删除它,否则 git 不会删除这些文件 - (可选)
git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5
- 检查最大的文件 - (可选)
git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98
- 检查这些文件是什么 git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names'
- 从所有修订中删除文件rm -rf .git/refs/original/
- 删除 git 的备份git reflog expire --all --expire='0 days'
- 使所有松散的对象过期git fsck --full --unreachable
- 检查是否有松动的物体git repack -A -d
- 重新包装git prune
- 最终移除这些对象