起因
由于一个挺傻的原因,我不得不进行一次关于 Git 的大批量操作,到我开始写这篇博客的时候,我仅仅完成了不到十分之一的工作量,还有及其漫长的工作需要等着我去做!!!
问题
之前一直在自己迭代一个资源管理工具,所以在测试的时候会导入一些测试用的资源,这本来是很正常的,但可能是因为脑子抽了的原因,我忘记关注测试资源的大小,直接把一个 3 个多 G 的资源提交到了我的版本库中,如果只是提交了也还好,可是我还手贱推送了。当时我也只是好奇,为啥今天的网速特别慢,我的推送怎么特别慢,直到我发现我推送的资源大小超标了,为时已晚,后悔莫及!!!
提交一时爽!一直提交一直爽!!
至此,我需要解决版本库过大的问题(存在无用资源)。
起初,我的想法很简单,我直接删除了相关资源,并再次提交。但我发现推送速度并没有降下来,依然很慢,到这时我才意识到问题的严重性,我可能不能使用常规的方法解决我的问题了。
不过,git 也为我们提供了后悔药,接下来我详细说明一下操作步骤。
步骤一
git diff-tree --no-commit-id --name-only -r commit_id
由于我已经有删除资源的提交了,所以不用重新确认我想要把哪些资源彻底的从我的版本库中移除,直接使用这条命令查询我这次提交中所有的文件路径,并粘贴出来备用。
步骤二
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all
这条命令就是用来将某个文件彻底移除出版本库的,将要移除的文件路径替换到 path-to-your-remove-file 中即可。
然后运行这个命令,当执行完之后,这个文件将从你的所有提交记录中移除。但此时你会发现,你的版本库大小并没有变小,主要是因为 git 并没有及时的清理缓存,所以我们要执行其他命令清除缓存。
步骤三
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
这就是清除 git 缓存的命令了,依次执行完,你想移除出版本库的文件就会彻底移除,这是你需要将版本库强制推送到远端,结束全部操作。
此方法不能做为常规方法使用,毕竟有可能造成各种严重的后果,比如你库没了!!!
结语
嘛,不过问题解决了也是好的。
请各位在提交的时候一定要注意,确定需要提交了再提交!!
请各位在提交的时候一定要注意,确定需要提交了再提交!!
请各位在提交的时候一定要注意,确定需要提交了再提交!!
PS: 博主需要删除的文件数量一共 3980 个,每个需要 110 秒。。。我的机器需要不停转的运行五天!!!血的教训啊!!QAQ!
PPS: 最终来报告下结果吧。。。处理完3980个文件,我总共花了两周的时间。。。心好累,我去睡觉了。。。
在 Git 上“毁尸灭迹”
https://xn--wgv44dw7s.cn/2019/04/10/mrGblMqn
评论