如何使用不在工作树中的提交清理 git 存储库

How clean git repository with commit which not in work tree

我用 bfg 清理了 Git 存储库(Bitbucket 云),但最后一次提交仍未清理(如 bfg 文档中所写:默认情况下,BFG 不会修改您最新提交的内容你的主(或 'HEAD')分支,即使它会清除它之前的所有提交。)。

不过没看到,想运行git gc在Bitbucket里
为此,我做了“git reset --hard HEAD”,然后回滚到“git push --force”。
但是存储库大小增加了?!

现在我有这个提交,旧历史留在存储库中,bfg 无法清理它,我该怎么办?
我怎样才能删除它,因为它不再附加到工作树?

您也可以使用 --no-blob-protection 标志告诉 BFG 更改最后一次提交。 *(这来自 BFG-Repo-Cleander 文档)。

或者,您可以创建一个新的提交来删除错误文件,然后 运行 BFG 正常。

再试一次,这次使用 newren/git-filter-repo, which will replace BFG and git filter-branch

如其文档中所述:

[there is] an extra steps to delete the other tags and do another gc are still required to clean out the old objects and avoid mixing new and old history before pushing somewhere

git filter-repo 确实避免了由于将旧的 repo 和重写的 repo 混合在一起而使用户感到困惑(并防止意外重新推送旧的东西)。


注意:在服务器端(即你要推送到的地方),一个git gc需要运行,这是完成的定期但不是立即。
那就是case for GitHub,还有BitBucket。

参见 Atlassian 文档“How to perform a manual garbage collection on a repository

Bitbucket implements its own garbage collection logic without relying on git gc anymore (this is achieved by setting the [gc] auto = 0 on all repositories).
When a fork is created, the pruneexpire=never is added to the git configuration and this is removed when the last fork is deleted.

作为:

BitBucket will run git gc themselves in response to doing git reset --hard HEAD~1 (which discards last commit) followed by git push -f.

所以在你的情况下:

git commit --allow-empty -m "empty commit"
git push

git reflog expire --expire-unreachable="30m" --all
git prune --expire="30m" -v
git gc --prune="30m"
git reset --hard HEAD~1
git push -f

并且 git gc 应该在 BitBucket 端完成!

我在 bitbucket 支持中写道,他们 运行 服务器上的脚本 "git gc" 并且清除了旧故事