likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 10

一、前言

今天项目在自动化构建的过程中,发现Gitlab-Runner报错,无法拉取Git项目。

如何剔除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 如何剔除Git项目,历史中提交的图片或压缩文件 文件从小到大展示排列

2、根据版本文件ID查询文件路径

git rev-list --objects --all | grep [版本文件ID]

执行下面命令

git rev-list --objects --all | grep e7935f0b1efe392410332c756c16419df4924477

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

发现大文件是一个图片文件,要删除的该历史版本,具体操作可以看下面

3、查看历史提交记录

git log --pretty=oneline --branches -- [文件路径]

执行命令

git log --pretty=oneline --branches -- gitbook/1645348773772学习金字塔.png

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

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项目,历史中提交的图片或压缩文件 我们可以看到,该命令会将历史提交的记录重写,删除该文件,

注意,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为例子,需要允许强制更新分支

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