如何剔除Git项目,历史中提交的图片或压缩文件

一、前言

今天项目在自动化构建的过程中,发现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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注