某个git库每次status一下就是半小时起步,gc后还是没有效果,后来排查记录发现某笔记录提交几百G的冗余文件,虽然revert了,但是还是存在库中,遂如下清理:
# 查找大文件
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -10# 根据HSA值找到对应文件名
git rev-list --objects --all | grep xxxxxxxxx# 前两条命令的组合
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -n | tail -10 | awk '{print$1}')"# 强制删除YOU-FILE-NAME,非常耗时
# filter-branch: 重写Git仓库中的提交
# --index-filter: 指定后面命令进行删除
# --all: 所有分支的提交(位于/refs下的所有引用)
git filter-branch --force --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch YOU-FILE-NAME" --tag-name-filter cat -- --all# 彻底清除
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 --all