繁体   English   中英

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

[英]How clean git repository with commit which not in work tree

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

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

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

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

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

再试一次,这次使用newren/git-filter-repo它将替换 BFG 和 git filter-branch

如其文档中所述:

[有] 删除其他标签并执行另一个 gc 的额外步骤仍然需要清除旧对象并避免在推送某处之前混合新旧历史

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


注意:在服务器端(即您要推送到的地方),需要运行 git gc,这是定期但不是立即完成的。
GitHub 和 BitBucket 就是这种情况

请参阅 Atlassian 文档“ 如何在存储库上执行手动垃圾收集

Bitbucket 实现了自己的垃圾收集逻辑,不再依赖git gc (这是通过在所有存储库上设置 [gc] auto = 0 来实现的)。
创建分叉时,将 pruneexpire=never 添加到 git 配置中,并在删除最后一个分叉时将其删除。

如此处所述

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”,旧故事被清理

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM