如何剔除Git项目,历史中提交的图片或压缩文件
一、前言
今天项目在自动化构建的过程中,发现Gitlab-Runner报错,无法拉取Git项目。
经过排查发现,Git项目太大,但门户站点图片却不是很多,查看.git版本信息,发现提交的历史版本太大了,已经168M了
Git作为一个分布式版本管理工具,每次提交都会将改动的版本保存到.git目录,所以提交更换的图片即使已经被删除了,也还是会存在Git提交的历史中
这种情况在工作中很常见,比如
- 将打包的代码上传到仓库/dist、/buld、/log等目录
- 将密钥或者账号密码上传到Github等开源仓库
- 将图片、压缩包等大文件上传到仓库
- 修改了文件名称,但是忽略文件不生效
如果不处理掉,就会导致项目越来越大,下载速度越来越慢,这里记录下处理过程
二、仅删除当前版本大文件,历史版本不动
删除本地大文件和目录,并清空git缓存。
比如app项目,我们不小心将/dist目录提交到了远程仓库,需要清除。
1、删除本地dist目录
cd app
rm -rf dist
2、将dist写入.gitignore,清除本地git缓存
# 写入dist目录到.gitignore
echo "/dist" >> .gitignore
# 清理本地git缓存
git rm -r --cached .
git add .
git commit -m "update .gitignore"
3、提交,推送到远程仓库
git push
其他开发者也需要清下本地的git缓存,否则还是会将清理的上传
三、排查大文件
有时候,我们将某个大文件提交了,但是找不到,此时我们可以通过git命令来查找大文件,然后检索出来
1、显示10个最大的文件
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10
如图:版本文件ID、文件类型、字节数、size-in-packfil、offset-in-packfile
文件从小到大展示排列
2、根据版本文件ID查询文件路径
git rev-list --objects --all | grep [版本文件ID]
执行下面命令
git rev-list --objects --all | grep e7935f0b1efe392410332c756c16419df4924477
发现大文件是一个图片文件,要删除的该历史版本,具体操作可以看下面
3、查看历史提交记录
git log --pretty=oneline --branches -- [文件路径]
执行命令
git log --pretty=oneline --branches -- gitbook/1645348773772学习金字塔.png
4、删除文件历史记录
删除单个文件
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch --ignore-unmatch [文件路径]' --prune-empty --tag-name-filter cat -- --all
删除文件夹
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch --ignore-unmatch [文件夹名称]' --prune-empty --tag-name-filter cat -- --all
- 删除文件夹
git rm
增加-r
- 如果文件夹名称有空格,需要使用双引号引起来
- --tag-name-filter 表示所有的标签都要更新下
执行命令
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch --ignore-unmatch gitbook/1645348773772学习金字塔.png' --prune-empty --tag-name-filter cat -- --all
我们可以看到,该命令会将历史提交的记录重写,删除该文件,
注意,git是分布式的,所以需要其他人的仓库也同步下,否则很容易其他的用户,再次将覆盖原来的版本
5、同步历史版本
# 强制更新所有分支和标签
git push --force --all
# 或强制更新单个分枝和标签
git push master:master --tags --force
6、需要将分支保护放开,允许强制提交,否则会提交失败
如果更新的分支被保护了,也就是报错
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
以Gitlab为例子,需要允许强制更新分支
转载自:https://juejin.cn/post/7152426769239244807