情景:Git小白,不小心提交了一个大文件(这是一个垃圾文件),并且push到了远端仓库。很多人反馈库下载很慢,你作为管理员,并不清楚是谁提交的代码,也不知道什么时候提交的,现在要怎么做?
有的小伙伴可能会说,使用git rm xxx
删除了对应的文件不就可以了吗?可以是可以,但git的历史记录中还是会保留一个文件的副本,如果文件很大,虽然这个文件没用,但每次下载的时候,还是会随着历史记录一起被下载下来,依然会导致下载时间长。
大文件识别
我们要做的第一步,就是先把这个大文件找出来。由于这个文件可能已经被删除了,这里我们用到了一套组合命令可以实现:
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
|
## 列举当前仓库中大小排名前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大的文件,在输出的文件列表中,挑选你觉得可疑的文件。
定位提交人
1
2
|
## 根据上面给出的列表,逐一找出提交人,然后与其确认是否是误操作,假设其中一个文件是video.mp4
git log -- video.mp4
|
## 根据上面给出的列表,逐一找出提交人,然后与其确认是否是误操作,假设其中一个文件是video.mp4
git log -- video.mp4
找到误操作的提交人后,对其进行Git操作规范指导,避免类似的事情重现。再进一步的话,就需要在组内全员强调git操作规范。
重写历史
1
2
3
4
5
|
## 过滤掉所有和video.mp4相关的所有提交,重写历史
git filter-repo --path-glob video.mp4 --invert-paths --force
## 执行垃圾回收,这会在本地文件缓存
git gc --aggressive
|
## 过滤掉所有和video.mp4相关的所有提交,重写历史
git filter-repo --path-glob video.mp4 --invert-paths --force
## 执行垃圾回收,这会在本地文件缓存
git gc --aggressive
这是一个比较危险的操作,谨慎使用;
强制推送
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
|
## 上面的命令会把remote信息清除掉,这里需要重新添加
git remote add origin git@ticktechman.github.com:ticktechman/demo.git
## 强制推送所有内容,覆盖远端仓库中的历史记录
git push --all --force
git push --tags --force
注意事项
- 最好先锁库(关闭其他人的推送权限),只保留一个人的推送权限;
- 强制推送的功能服务端是默认关闭的,毕竟修改了git提交历史,需要给推送者开启强制推送权限;
- 推送完成后,提醒所有相关人员重新下载代码;
- 如果文件不算大,还是算了吧 :-) ;