有些时候不小心上传了一些敏感文件(例如密码), 或者不想上传的文件(没及时或忘了加到.gitignore里的),而且上传的文件又特别大的时候,
这将导致别人clone你的代码或下载zip包的时候也必须更新或下载这些无用的文件
因此, 我们需要一个方法, 永久的删除这些文件(包括该文件的历史记录).

Git永久删除历史文件(包含历史记录)

  • 1 查找文件名称
  • 2 从资料库中删除文件
  • 3 推送我们修改后的repo
  • 4 清理和回收空间

1 查找文件名称

如已知文件名称,忽略此步骤。


# 查找最大的5个文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

2 从资料库中删除文件


git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch path-to-your-remove-file' --prune-empty --tag-name-filter cat -- --all

其中, path-to-your-remove-file 就是你要删除的文件的相对路径(相对于git仓库的跟目录), 替换成你要删除的文件即可. 注意一点,这里的文件或文件夹,都不能以 ‘/’ 开头,否则文件或文件夹会被认为是从 git 的安装目录开始。

如果你要删除的目标不是文件,而是文件夹,那么请在 git rm --cached' 命令后面添加 -r 命令,表示递归的删除(子)文件夹和文件夹下的文件,类似于 rm -rf` 命令。

此外,如果你要删除的文件很多, 可以写进一个.sh文件批量执行, 如果文件或路径里有中文, 由于MinGW或CygWin对中文路径设置比较麻烦, 你可以使用通配符号, 例如: sound/music_.mp3, 这样就把sound目录下以music_开头的mp3文件都删除了.

例如这样, 新建一个 bash 脚本文件,del-music-mp3.sh:

#!/bin/bash
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch projects/Moon.mp3' --prune-empty --tag-name-filter cat -- --all
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch sound/Music_*.mp3' --prune-empty --tag-name-filter cat -- --all

如果你看到类似下面这样的, 就说明删除成功了:

Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266)
# Ref 'refs/heads/master' was rewritten

如果显示 xxxxx unchanged, 说明repo里没有找到该文件, 请检查路径和文件名是否正确.

注意: 补充一点, 如果你想以后也不会再上传这个文件或文件夹, 请把这个文件或文件夹添加到.gitignore文件里, 然后再push你的repo.

3 推送我们修改后的repo


## 以强制覆盖的方式推送你的repo, 命令如下:
git push origin master --force --all## 这个过程其实是重新上传我们的repo, 比较耗时, 虽然跟删掉重新建一个repo有些类似, 但是好处是保留了原有的更新记录, 所以还是有些不同的. 如果你实在不在意这些更新记录, 也可以删掉重建, 两者也差不太多, 也许后者还更直观些.## 为了能从打了 tag 的版本中也删除你所指定的文件或文件夹,您可以使用这样的命令来强制推送您的 Git tags:git push origin master --force --tags

4 清理和回收空间

虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.

命令如下:

rm -rf .git/refs/original/git reflog expire --expire=now --allgit gc --prune=nowgit gc --aggressive --prune=now

现在你再看看你的.git目录文件大小是不是变小了.

Git永久删除历史文件(包含历史记录)相关推荐

  1. linux git 撤销删除文件,删除文件以后,如何通过git撤销删除的文件,不提交到远端代码库...

    检查状态,看看发生了什么: $ git status On branch master Changed but not updated: (use "git add/rm ..." ...

  2. 怎么找回永久删除的文件

    每天上班我们都要处理各种文件,如PPT.Excel.图片等类型.这些文件虽然保存在电脑里,但删除时难免会有一些错误.如果我们不小心把文件永久删除了,该怎么办呢?又该怎么找回永久删除的文件?这里小编整理 ...

  3. Win10永久删除的文件怎么恢复?实用指南!

    案例:怎么恢复win10永久删除的文件? [今天我使用电脑时不小心把一些非常重要的文件永久删除了!这可怎么办!我的电脑是win10系统的,想问问各位使用win10的小伙伴,有什么新手也可以操作的好用方 ...

  4. Git 彻底删除大文件

    Git 彻底删除大文件 Tags: <git> pyecharts 的 git history 中存在着很多以前文档需要的图片,导致 pyecharts 整个 git 仓库体积达到 90M ...

  5. 电脑上永久删除的文件怎么恢复?其实很简单

    永久性删除文件,是指彻底删除回收站的文件,或者对文件执行了shift+delete.这个文件就不可见了,但其实电脑还存储着这个文件.接下来本篇文章就为你演示,电脑上永久删除的文件怎么恢复. 方法一:通 ...

  6. 不小心永久删除的文件怎么恢复?被永久删除的文件还能找回吗

    不小心永久删除的文件怎么恢复?在删除文件时可能一个不小心就把重要文件也给删除了,如果文件刚删除那还好办,我们直接在回收站里进行还原就行,通常来说被删除的文件都会临时保存在回收站里,方便我们在发现文件删 ...

  7. sql delete删除的数据怎么恢复_如何恢复按下Shift + DELETE键永久删除的文件和资料夹?...

    简单删除和Shift+Delete永久删除 想删除电脑上的任何文件,有以下两种方式: ① 按「DELETE」键简单删除文件.在这种模式下,文件被移动到回收站.此时,如果我们想要恢复已删除的文件和资料夹 ...

  8. 远程mysql定时删除数据_mysql定时备份数据库 删除历史文件 将备份数据库传送到另外服务器...

    定时备份数据库脚本并压缩删除历史文件 1.创建备份脚本 vim   mysql-backup.sh #!/bin/bash bak=`date +%y-%m-%d-%H` tool=/usr/loca ...

  9. 永久删除的文件还能找回来吗 永久删除的文件如何恢复

    在日常生活和工作中,我们经常需要处理各种文件.有时,我们可能会误删除重要文件,甚至执行了永久删除操作.那么,永久删除的文件还能找回来吗?如果可以,永久删除的文件如何恢复?接下来就来为大家讲解一下吧. ...

最新文章

  1. EOJ Monthly 2018.1
  2. hmr webpack 不编译_一文搞懂 webpack HMR 原理
  3. xgboost算法_详解xgboost算法的样本不平衡问题
  4. Linux下查看进程和线程
  5. java虚拟机读写其他进程的数据
  6. mac如何看html5视频播放器,苹果Mac系统看HTML5视频教程介绍
  7. avro 序列化java_Avro 对象序列化与反序列化,及转Json对象序列化处理
  8. Linux性能分析之网络篇
  9. Qtum研究院:市面上企业级解决方案都有哪些亮点?
  10. Android 实现RecyclerView长按弹出Menu 点击删除
  11. nginx limit配置参数解读
  12. USBCNC导入DXF文件
  13. python开发grasshopper插件_Rhino_Grasshopper_Python 开发的正确姿势
  14. html富强民主鼠标特效,给网站添加鼠标点击特效富强、民主、和谐 js效果 - 寒星皓月...
  15. Cherno C++ P61 C++的命名空间
  16. 解决1 error and 0 warnings potentially fixable with the `--fix` option.
  17. Python爬虫之App爬虫视频下载
  18. TTS离线语音合成应用方案【一】
  19. 2022年9月大学英语B统考题库网考大学英语B试题
  20. 兼职项目分享,在家就可以做的八个副业项目,利用业余时间增加收入吧

热门文章

  1. 使用Tensorflow构建属于自己的图片分类器
  2. 交换机-Smart Link AND Monitor Link的配置
  3. 浅谈霍尔电流传感器在数据中心直流列头柜里的运用
  4. 自学软件测试 - 功能测试篇
  5. 戴文的Linux内核专题:03 驱动程序【转】
  6. EasyUI datagrid列名包含特殊字符(如:%等),会导致表格错位
  7. MaxCompute(ODPS)实现笛卡尔积
  8. 用java代码实现pdf文档转word
  9. 海上钢琴家 与程序员
  10. ZKFinger Live20R 版对接java - B/S(网络版)