如何使用不在工作树中的提交清理 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" 并且清除了旧故事
我用 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 doinggit reset --hard HEAD~1
(which discards last commit) followed bygit 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" 并且清除了旧故事