这是我的.git文件夹的大小:
$ du -sh .git
321M .git在过去,有几个巨大的文件被不小心地提交到了那里。
通过一些bizarre magic,我找到了丘比特和它们的斑点:
$ git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | sed -n 's/^blob //p' | sort --numeric-sort --key=2 | cut -c 1-12,41- | $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
....
5c48fadaee41 492MiB android/java_pid3568.hprof
...这些行为的作者承诺:
git log --all --full-history -- "android/java_pid3568.hprof"
commit cac160ab39b9c70f3d05f8194be8c3c0657161ad
Author: Incore <xxxx@mail.ru>
Date: Thu Dec 10 18:34:34 2020 +0300
commit fc0cfc2f32ddd0f927169ad0514213f79795dd63
Author: Incore <xxxx@mail.ru>
Date: Tue Dec 8 21:26:17 2020 +0300之后,我试图重写我的历史记录,删除这个文件:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch android/java_pid3568.hprof' --prune-empty --tag-name-filter cat -- --all
Rewrite fc0cfc2f32ddd0f927169ad0514213f79795dd63 (19/376) (1 seconds passed, remaining 18 predicted) rm 'android/java_pid3568.hprof'
Rewrite 540ced9097b7090bfd68279515178bf060db93ee (19/376) (1 seconds passed, remaining 18 predicted) rm 'android/java_pid3568.hprof'现在,我的git log显示历史上没有这样的文件:
git log --all --full-history -- "android/java_pid3568.hprof"
... empty response但是,我的.git文件夹的大小并没有缩小:
$ du -sh .git
321M .git为什么会这样呢?
发布于 2021-02-26 15:45:51
包含巨大文件的提交仍然由reflog处理,因此不能仅由git gc垃圾收集。
您可以在以下问题的答案中找到一些很好的命令:How to remove unreferenced blobs from my git repo
喜欢
git reflog expire --expire-unreachable=now --all
git gc --prune=now或
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gcPS:哦,用https://rtyley.github.io/bfg-repo-cleaner/来做这样的清洁总是个好主意。比过滤分支更容易、更安全、更快。
https://stackoverflow.com/questions/66387507
复制相似问题