Git进阶-删除垃圾大文件

2024/06/04 | 字数1072 | 阅读3分钟


情景:Git小白,不小心提交了一个大文件(这是一个垃圾文件),并且push到了远端仓库。很多人反馈库下载很慢,你作为管理员,并不清楚是谁提交的代码,也不知道什么时候提交的,现在要怎么做?

有的小伙伴可能会说,使用git rm xxx删除了对应的文件不就可以了吗?可以是可以,但git的历史记录中还是会保留一个文件的副本,如果文件很大,虽然这个文件没用,但每次下载的时候,还是会随着历史记录一起被下载下来,依然会导致下载时间长。

大文件识别

我们要做的第一步,就是先把这个大文件找出来。由于这个文件可能已经被删除了,这里我们用到了一套组合命令可以实现:

bash
1
2
3
4
5
6
## 列举当前仓库中大小排名前10的文件,这套组合估计大家看了都会头皮发麻
git gc
git rev-list --objects --all | grep -f <(git verify-pack -v .git/objects/pack/*.idx | grep blob | sort -k3 -n | cut -f 1 -d ' ' | tail -10)

## 当然也可以用下面的命令,这个命令是小编自己开发的: https://github.com/ticktechman/git-commands
git largefiles -t 10

上面列举了当前仓库中TOP 10大的文件,在输出的文件列表中,挑选你觉得可疑的文件。

定位提交人

bash
1
2
## 根据上面给出的列表,逐一找出提交人,然后与其确认是否是误操作,假设其中一个文件是video.mp4
git log -- video.mp4

找到误操作的提交人后,对其进行Git操作规范指导,避免类似的事情重现。再进一步的话,就需要在组内全员强调git操作规范。

重写历史

bash
1
2
3
4
5
## 过滤掉所有和video.mp4相关的所有提交,重写历史
git filter-repo --path-glob video.mp4 --invert-paths --force

## 执行垃圾回收,这会在本地文件缓存
git gc --aggressive

这是一个比较危险的操作,谨慎使用;

强制推送

bash
1
2
3
4
5
6
## 上面的命令会把remote信息清除掉,这里需要重新添加
git remote add origin git@ticktechman.github.com:ticktechman/demo.git

## 强制推送所有内容,覆盖远端仓库中的历史记录
git push --all --force
git push --tags --force

注意事项

上一篇:Git进阶-如何管理非文本文件 下一篇:Git进阶-拆分仓库

【文章不错,鼓励一下】