git从历史彻底删除大文件并清理瘦身仓库

go项目的包管理依赖从glide+仓库vendor迁移成go mod,通过glide.yaml 和glide.lock 文件使用

go mod init 
go mod tidy 

可以轻松生成对应的go.mod 和go.sum 依赖管理文件,后续使用go mod pkg 管理即可,剩下的vendor 也需要使用 git rm 删除 ,删除后留下的.git 仓库索引依然很大,因此需要对历史进行重写

git如何永久删除历史文件(不小心提交的密码 vendor 二进制等 均可以删除) 如果知道要删除的文件可使用如下命令(实际使用过程把vendor 替换成自己的文件路径, 我这里不保留cache到磁盘 )

git filter-branch --force --index-filter 'git rm -rf --ignore-unmatch vendor' --prune-empty --tag-name-filter cat -- --all

如果要保留文件到磁盘可使用

git filter-branch --force --index-filter 'git rm --cached -r --ignore-unmatch vendor' --prune-empty --tag-name-filter cat -- --all

如果不知道要删除的文件是哪个导致仓库大可先查找大文件(也可以用bfg工具)

 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

修改可能需要很久,完成后出现类似下面的提示就标示删除成功 Rewrite xxxx (266266)

Ref ‘refs/heads/master’ was rewritten

强制推送到remote git push origin master –force 接下来对git 仓库进行瘦身,命令如下:

rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

截止执行最关键的一步,也是最危险的一步(同步.git到远端),好多人说执行完上面的remote的仓库大小不变,重新克隆下来依然很大,其实是因为没有同步gc 后的仓库到远端,执行:

 **git push --mirror**

参考: Git如何永久删除文件(包括历史记录) 从仓库的历史记录中删除文件 git瘦身 彻底删除 Git 仓库中的文件避免占用大量磁盘空间 BFG an alternative to git-filter-branch 如何瘦身 Git 仓库 progit

本文链接:参与评论 »

--EOF--

提醒:本文最后更新于 1236 天前,文中所描述的信息可能已发生改变,请谨慎使用。

Comments