如何删除Git提交记录中的大文件

当Git仓库中存在大文件,会持续保留在Git历史中,下面是对删除这些大文件的一些解决方案

已提交到git缓存

删除缓存

1
git rm --cached video.mp4

已提交到本地分支

reset到上一个版本

1
2
git reset HEAD^
git gc

已提交到远程分支

1
2
3
4
5
6
7
8
9
## 删除本地文件和历史
git gc
git filter-repo --path-glob video.mp4 --invert-paths --force
git gc --aggressive

## 推送到远程分支
git remote add origin git@ticktechman.github.com:ticktechman/demo.git
git push --all --force
git push --tags --force

git filter-repo不是原生git命令,是一个拓展,从本地记录中寻找和指定文件相关的提交,将其全部删除,重写整个历史。

git filter repo仓库

对未知大文件的远程仓库清理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 寻找大文件
git gc
git rev-list --objects --all |grep -f (git verify-pack -v .git/objects/pack/*.idx | grep blob | sort -k 3 -n |cut -f 1 -d " " | tail -10)

# 或者使用该拓展命令获取前10大小的blob文件, https://github.com/ticktechman/git-commands
git largefiles -t 10

# 从本地中删除大文件并重写历史
git filter-repo --path-glob xxx.mp4 --invert-paths --force
git gc --aggressive

## 推送到远程分支
git remote add origin git@ticktechman.github.com:ticktechman/demo.git
git push --all --force
git push --tags --force