使用场景
1、以前项目中上传了比较大的jar包,使项目比较大,主要是 .git/objects/pack/
目录下;
2、上传了敏感信息,比如说数据库密码到git上,需要删除,除了删库的另外一种解决方案
方式一:BFG
下载BFG:https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar
下载项目,注意要使用--mirror
git clone --mirror https://code.prepared.com/test/prepared-test-bigfile.git
把下载下来的jar包,拷贝到项目根目录下;
打开console,执行命令:
java -jar bfg-1.14.0.jar --delete-files test1-3.3.1.jar
test1-3.3.1.jar 替换为自己的文件名;如果不知道哪些文件比较大,可以执行下面的命令,查找大于100M的文件,进行删除
java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 100M prepared-test-bigfile.git
进入项目中,强制引用该文件的内容过期,并执行垃圾回收
cd prepared-test-bigfile.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
推送代码,需要有git所有者权限,否则会报错
git push
没有权限的报错信息:
remote: GitLab: You are not allowed to change existing tags on this project.
执行之后的结果:
另一种方式 git filter-branch
pack-772b716f8d71e2*****60bbd42b.idx
这个是自己的文件名,可以在.git/objects/pack
目录下查看占用空间比较大的文件明
git verify-pack -v .git/objects/pack/pack-772b********e685060bbd42b.idx | sort -k 3 -n | tail -3
执行这个命令会展示占用空间比较大的几个文件的名字
git rev-list --objects --all | grep 91d11e8ee808********a3001d51fe423e56
输出
项目名/lib/test1-1.0.3.jar
项目名/lib/test2-3.1.0.jar
项目名/lib/test3-2.1.4.jar
删除引用这个jar包的引用
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch 项目名/lib/test1-1.0.3.jar' --prune-empty
之后执行,执行垃圾回收
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git fsck --full --unreachable
git repack -A -d
git gc --aggressive --prune=now
git push --force
参考链接:
https://rtyley.github.io/bfg-repo-cleaner/
https://docs.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository