永久删除大文件
- 从你的资料库中清除文件
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-delete-file 就是你要删除的文件的相对路径(相对于git仓库的根目录), 替换成你要删除的文件即可. 注意一点,这里的文件或文件夹,都不能以 ‘/’ 开头,否则文件或文件夹会被认为是从 git 的安装目录开始。
如果你要删除的目标不是文件,而是文件夹,那么请在 git rm
命令后面添加 -r
命令,表示递归的删除(子)文件夹和文件夹下的文件,类似于 rm -rf
命令。
- 推送我们修改后的repo
git push origin master --force --all
为了能从打了 tag 的版本中也删除你所指定的文件或文件夹,您可以使用这样的命令来强制推送您的 Git tags:
$ git push origin master --force --tags
- 清理和回收空间
虽然上面我们已经删除了文件, 但是我们的repo里面仍然保留了这些objects, 等待垃圾回收(GC), 所以我们要用命令彻底清除它, 并收回空间.
rm -Rf .git/refs/original
rm -Rf .git/logs/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
## 看看文件是不是变小了
git count-objects -v
【如何删除 git 历史里的大文件】
1)使用如下的命令找出历史上的大文件。引用:https://stackoverflow.com/questions/10622179/how-to-find-identify-large-commits-in-git-history
git rev-list --objects --all |
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
sed -n 's/^blob //p' |
sort --numeric-sort --key=2 |
cut -c 1-12,41- |
$(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
2)使用 bfg -D <文件名>,直接删除。引用:https://docs.github.com/en/authentication/keeping-your-account-and-
data-secure/removing-sensitive-data-from-a-repository
3)根据 bfg 提示执行
git reflog expire --expire=now --all && git gc -- prune=now --aggressive
4) 推上 Github
git push -f