【发布时间】:2019-03-17 17:48:17
【问题描述】:
(已解决,见问题正文底部)
找这个找了很久,到现在有的是:
- 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- 最终移除这些对象
【问题讨论】:
-
zneak - 我的问题在标题中。 gbacon - 尝试了这些,文件仍然保留在包文件中......
-
如果您查看重复文件中引用的文章,它会显示如何在删除有问题的文件后压缩您的对象存储。
-
这是救命稻草。心理提示:始终将潜在的巨大 *.log 文件添加到 .gitignore。在此之后从 800mb 的 repo 变成了 6mb。
-
第二步和第三步合二为一
for i in `git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5` ; do git rev-list --objects --all | grep $(echo $i | sed 's/ .*//g') ; done
标签: git version-control git-rewrite-history