一、前言
今天项目在自动化构建的过程中,发现Gitlab-Runner报错,无法拉取Git项目。
经过排查发现,Git项目太大,但门户站点图片却不是很多,查看.git版本信息,发现提交的历史版本太大了,已经168M了
Git作为一个分布式版本管理工具,每次提交都会将改动的版本保存到.git目录,所以提交更换的图片即使已经被删除了,也还是会存在Git提交的历史中
这种情况在工作中很常见,比如
-
将打包的代码上传到仓库/dist、/buld、/log等目录
-
将密钥或者账号密码上传到Github等开源仓库
-
将图片、压缩包等大文件上传到仓库
-
修改了文件名称,但是忽略文件不生效
如果不处理掉,就会导致项目越来越大,下载速度越来越慢,这里记录下处理过程
二、仅删除当前版本大文件,历史版本不动
删除本地大文件和目录,并清空git缓存。
比如app项目,我们不小心将/dist目录提交到了远程仓库,需要清除。
1、删除本地dist目录
cd apprm -rf dist
2、将dist写入.gitignore,清除本地git缓存
# 写入dist目录到.gitignoreecho /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 39;git rm --cached --ignore-unmatch --ignore-unmatch [文件路径] 39; --prune-empty --tag-name-filter cat -- --all
删除文件夹
git f为lter-branch --force --index-filter 39;git rm -r --cached --ignore-unmatch --ignore-unmatch [文件夹名称] 39; --prune-empty --tag-name-filter cat -- --all
-
删除文件夹
git rm
增加-r
-
如果文件夹名称有空格,需要使用双引号引起来
-
–tag-name-filter 表示所有的标签都要更新下
执行命令
git filter-branch --force --index-filter 39;git rm --cached --ignore-unmatch --ignore-unmatch gitbook/1645348773772学习金字塔.png 39; --prune-empty --tag-name-filter cat -- --all