写在前面

大家一定遇到过在使用Git时,不小心将一个很大的文件添加到库中,即使删除,记录中还是保存了这个文件。以后不管是拷贝,还是push/pull都比较麻烦。今天在上传工程到github上,发现最大只能上传100MB大小文件,在本地git库中有一个150MB文件,虽然已经删除,但还保存了记录。下面教大家如何从库中彻底删除无效大文件。


删除大文件

方法很简单,就是先找到大文件对象再删除

  1. 先提交所有更改

     $ git commit -am "commit all"
  2. 对仓库进行gc操作

     $ git gc
  3. 运行count-objects 查看空间使用,size-pack 是以千字节为单位表示的 packfiles 的大小,因此已经使用了大约150MB 。

     $ git count-objects -v

  4. 运行底层命令 git verify-pack 以识别出大对象,对输出的第三列信息即文件大小进行排序.

    $ git verify-pack -v .git/objects/pack/pack-8eaeb...9e.idx | sort -k 3 -n | tail -3

    注:可以看到对底下那个就是大文件。

  5. 使用 rev-list 命令,传入 - -objects 选项,它会列出所有 commit SHA 值,blob SHA 值及相应的文件路径,这样查看 blob 的文件名。

    $ git rev-list --objects --all | grep 185ab8d

  6. 将该文件从历史记录的所有 tree 中移除。

    $ git log --pretty=oneline --branches -- spark-assembly-1.3.1-hadoop2.4.0.jar

  7. filter-branch 命令重写从 646784 开始的所有 commit 才能将文件从 Git 历史中完全移除。

    git filter-branch --index-filter 'git rm --cached --ignore-unmatch  spark-assembly-1.3.1-hadoop2.4.0.jar' -- 646784d95f347749517a67c50c117f4bf85d0b42..

    注:- -index-filter 选项类似于 - -tree-filter 选项,但这里不是传入一个命令去修改磁盘上签出的文件,而是修改暂存区域或索引。不能用 rm file 命令来删除一个特定文件,而是必须用git rm - -cached 来删除它 ── 即从索引而不是磁盘删除它。这样做是出于速度考虑 ── 由于 Git 在运行你的 filter 之前无需将所有版本签出到磁盘上,这个操作会快得多。也可以用 - -tree-filter 来完成相同的操作。git rm- -ignore-unmatch 选项指定当你试图删除的内容并不存在时不显示错误。最后,因为你清楚问题是从哪个 commit 开始的,使用 filter-branch 重写自 64678 这个 commit 开始的所有历史记录。不这么做的话会重写所有历史记录,花费不必要的更多时间。

  8. 现在历史记录中已经不包含对那个文件的引用了。不过 reflog 以及运行 filter-branch 时 Git 往.git/refs/original 添加的一些 refs 中仍有对它的引用,因此需要将这些引用删除并对仓库进行 repack 操作。在进行 repack 前需要将所有对这些 commits 的引用去除。

    \$ rm -Rf .git/refs/original
    \$ rm -Rf .git/logs/
    \$ git gc
  9. 查看空间使用

     $ git count-objects -v
  10. 如果真的要完全把这个对象删除,可以运行 git prune 命令。


【完】

Git从库中移除已删除大文件相关推荐

  1. Linux 系统中成功恢复已删除的文件

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 当用户意外地删除 ...

  2. 在Git存储库中查找并恢复已删除的文件

    假设我在Git存储库中. 我删除文件并提交更改. 我继续工作并做出更多承诺. 然后,我发现需要还原该文件. 我知道我可以使用git checkout HEAD^ foo.bar来签出文件,但是我真的不 ...

  3. 如何恢复已删除的文件:终极指南

    It's happened to most of us. You delete a file, and then realize you need it back. This guide explai ...

  4. 在git中取消删除已删除的文件

    本文翻译自:Unstage a deleted file in git Usually, to discard changes to a file you would do: 通常,要放弃对文件的更改 ...

  5. 计算机中丢失repo,我的本地git repo有“未上演”的已删除文件,远程是文件,如何删除丢失的文件?...

    我读过关于git clean和git reset但我不认为他们做了我需要的事情.我尝试了git pull,但没有解决问题(git pull结果为:Already up-to-date.) 我在gith ...

  6. 如何在前端删除项目中的文件_如何在macOS上恢复已删除的文件

    有时候不小心删除了我们不打算删除的MacBook上的文件.在MacBook上恢复永久删除的文件非常困难,但这并非不可能.在本文中,我们将指导您如何恢复MacBook上最近恢复的文件或永久删除的文件.从 ...

  7. 成功恢复 Linux 系统中已删除的文件

    点击关注公众号,回复"1024"获取2TB学习资源! 当用户意外地删除了一个仍然需要的文件时,大多数情况下,是没有简便的方法可以重新找回或重建这个文件.不过,幸运的是文件是可以通过 ...

  8. Linux 系统中恢复已删除的文件

    注:文章内容仅用于本人日常学习记录 Linux 系统中恢复已删除的文件 当用户意外地删除了一个仍然需要的文件时,大多数情况下,是没有简便的方法可以重新找回或重建这个文件.不过,幸运的是文件是可以通过一 ...

  9. linux disk 清除数据,如何在Linux中使用TestDisk恢复已删除的文件

    我们都知道寻找文件而不是找到文件的感觉,即使是在垃圾桶里也是如此. 由于TestDisk ,文件和数据丢失带来的创伤应该结束 - 这是一个免费的开源软件,最初设计用于恢复内存分区并使不可引导的磁盘再次 ...

最新文章

  1. linux 网站架构的演变
  2. webpack使用插件将css抽取出来
  3. 写linux程序测试吞吐量,Linux下测试磁盘性能(IO、吞吐量)
  4. NET问答: 发布 asp.net core 时如何修改 ASPNETCORE_ENVIRONMENT 环境变量?
  5. 前端学习(3164):react-hello-react之添加todoList
  6. 关于linux系统中无法识别某一命令问题的解决方案
  7. 【iOS开发-74】解决方式:Xcode6下利用preference保存数据,终于的plist文件在哪里?...
  8. solr php大小写,Solr 学习(6) —- Solr的PHP客户端
  9. Java 代码性能优化总结
  10. 计算机网络中什么是突发错,计算机网络基础习题(含答案)
  11. 阿里巴巴confont项目的使用
  12. 怪物刷新时间计时_《冒险岛2》游戏中查找怪物刷新时间
  13. 公众号点击图片变成另一张_朋友圈也能发九宫格图片,再也不犯选择困难症
  14. 2022年最好的游戏引擎是什么?
  15. 在MT终端模拟器中使用Termux命令
  16. Mac解压rar文件工具
  17. node 脚手架项目,快速删除 node_modules 包的 rimraf 命令
  18. 华为机试真题 C++ 实现【最大化控制资源成本】【100%通过率】【2022.11 Q4 新题】
  19. C/C++模拟按键按下弹起
  20. 《新概念英语》有声电子书的实现

热门文章

  1. Android基础之十八显示gif动画,动态图片
  2. 直播 | 如何在顶会夺冠:iWildCam 2020 冠军经验与技巧分享
  3. Windows11之Dev-C++超详细下载安装与使用教程
  4. Unity 3D 多媒体 音频
  5. 速锐得解码特斯拉Model Y整车网关电路及CAN通信协议DBC控制策略
  6. Spring Cloud Hystrix 服务容错保护
  7. android之animator 和animation 的区别
  8. Java技术Jsoup爬取数据手动登录
  9. win10打开telnet客户端
  10. OpenCV—用meanshift和Camshift进行目标追踪