使用bfg快速清理git历史大文件
使用bfg快速清理git历史大文件
之前写过一篇的,使用的git命令清理的大文件,但是我3G多的git,.git文件夹里面的pack就3G多,而且是个好几年并且在持续开发的项目,里面的提交成千上万了,每次使用
git filter-branch
,都要好几个小时,我研究了一下,要彻底清理项目中的那一堆大文件,只要要用脚本连续跑两天。。。
最近发现了一个方案,使用bfg,我仅仅十几分钟就处理完了
原先的方案:https://blog.csdn.net/qq_36254947/article/details/108601940
步骤
- 解除保护分支
默认情况下,git项目是有一个保护分支的
- 拉取代码
注意:需要ssh拉取,http不行(ssh拉取需要配置ssh密钥)
git配置ssh密钥
git clone --mirror git项目的ssh地址
# 拉取的是 项目名.git 文件夹,这是Git项目中的.git文件夹
- 查看大文件
# 进入项目文件夹
cd xxx.git
# 查询大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"
# tail -n 代表查看前n个大文件,
- 清理文件夹
java -jar bfg-1.13.0.jar --delete-folders 清理的文件夹名字 本地git项目地址
# 注意:文件夹名字,而不是文件夹路径,要小心别把其他文件夹中的同名的文件夹删除了
# 若是jar包放到了 git项目中,不需要添加 本地git项目地址 ,但最好不要放到.git文件夹中
- 清理文件
java -jar bfg-1.13.0.jar --delete-files 删除的文件名 本地git项目地址
# 注意:这是文件名只是名字部分,不包含路径
- 清理无效文件
# 删除的文件和文件夹,需要这一步才会真正清除
git reflog expire --expire=now --all && git gc --prune=now --aggressive
- 查看大小
git count-objects -vH
# 此时就能发现项目小了
- 推送
git push -f # -f 强制推送
脚本
# 开始
time1=$(date)
echo 开始时间 $time1
echo 拉取项目
git clone --mirror git@1xxxx.git
jarpach="D:\test1\bfg-1.13.0.jar" # jar包地址
cd "D:\转换\test1\xxx.git" # git项目地址
git count-objects -vH
echo
echo
echo
echo 清理文件提交
echo
# 将需要清理的文件列出来
java -jar $jarpach --delete-folders 文件夹1
java -jar $jarpach --delete-folders 文件夹2
java -jar $jarpach --delete-files dist.*
java -jar $jarpach --delete-files 文件2
echo
echo
echo 清理无效文件
echo git reflog expire --expire=now --all && git gc --prune=now --aggressive
echo
echo
echo 清理完成
git count-objects -vH
echo
time2=$(date)
echo 开始时间 $time1 ---结束时间 $time2
清理完之后,若是没有问题,进入项目文件夹使用git push -f
强制推送即可,之后别忘记清理服务器
清理服务器
清理完文件之后,需要清理一下服务器
#从git服务器进入这个项目的.git文件夹
cd /var/opt/gitlab/git-data/repositories/xx/.git #根据配置可能不同
# 清理文件
git gc --prune=now --aggressive
#查看大小
git count-objects -vH
注意:我清理完之后,git服务器使用http不能拉取代码了,重启服务器解决了