(已解决,见题体底部)
找了很久了,目前为止我得到的是:
- 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 |排序-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
- 最终删除那些对象
最佳答案
如果没有访问您的存储库数据,我不能肯定地说,但我相信可能有一个或多个打包的引用仍在引用您运行 git filter-branch
之前的旧提交。这可以解释为什么 git fsck --full --unreachable
不会将大 blob 称为无法访问的对象,即使您已经使 reflog 过期并删除了原始(未打包的)refs。
这是我要做的(在完成 git filter-branch
和 git gc
之后):
1) 确保原始引用已消失:
rm -rf .git/refs/original
2) 使所有 reflog 条目过期:
git reflog expire --all --expire='0 days'
3) 检查旧的打包 refs
这可能会很棘手,具体取决于您有多少打包的引用。我不知道有任何 Git 命令可以自动执行此操作,因此我认为您必须手动执行此操作。备份 .git/packed-refs
。现在编辑 .git/packed-refs
。检查旧引用(特别是,查看它是否打包了来自 .git/refs/original
的任何引用)。如果您发现任何不需要的旧文件,请将其删除(删除该 ref 的行)。
清理完 packed-refs
文件后,查看 git fsck
是否注意到无法访问的对象:
git fsck --full --unreachable
如果这样做有效,并且 git fsck
现在报告您的大 blob 无法访问,您可以继续下一步。
4) 重新打包您打包的存档
git repack -A -d
这将确保无法访问的对象被解包并保持解包。
5) 修剪松散的(无法到达的)对象
git 修剪
那应该就可以了。 Git 确实应该有更好的方法来管理打包的引用。也许有更好的方法,我不知道。在没有更好的方法的情况下,手动编辑 packed-refs
文件可能是唯一的方法。
关于git - 从 git 存储库中删除文件(历史),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2164581/