为了账号安全,请及时绑定邮箱和手机立即绑定

从git存储库中删除文件(历史记录)

从git存储库中删除文件(历史记录)

Git
扬帆大鱼 2019-11-25 10:53:18
很长时间以来,我一直在寻找以下内容: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/originalrm -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" HEADrm -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 -最终删除那些对象
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

我不能肯定地说不能访问您的存储库数据,但是我相信可能有一个或多个打包引用仍然引用您运行前的旧提交git filter-branch。这可以解释为什么git fsck --full --unreachable即使您的reflog已过期并删除了原始(未打包的)ref,也不会将大blob称为不可访问的对象。


这是我会怎么做(后git filter-branch并git gc已经完成):


1)确保原始裁判不见了:


rm -rf .git/refs/original


2)使所有reflog条目过期:


git reflog expire --all --expire='0 days'


3)检查旧包装的裁判


这可能很棘手,具体取决于您有多少个打包的引用。我不知道可以自动执行此操作的任何Git命令,因此我认为您必须手动执行此操作。备份.git/packed-refs。现在编辑.git/packed-refs。检查是否有旧的裁判(尤其是查看是否包装了的任何裁判.git/refs/original)。如果您发现任何不需要的旧文件,请将其删除(删除该引用的行)。


完成清理packed-refs文件后,请查看是否git fsck注意到无法访问的对象:


git fsck --full --unreachable


如果这行得通,并且git fsck现在报告您的大Blob无法访问,则可以继续执行下一步。


4)重新打包打包的档案


git repack -A -d


这将确保无法到达的对象被解压并保持解压。


5)修剪松散(无法到达)的物体


git prune


那应该做到的。Git确实应该有更好的方法来管理打包的引用。也许有我不知道的更好的方法。在没有更好的方法的情况下,手动编辑packed-refs文件可能是唯一的方法。


查看完整回答
反对 回复 2019-11-25
  • 3 回答
  • 0 关注
  • 739 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信