使用BFG清理Git历史时遇‘branch is currently checked out’错误如何解决?
解决BFG清理本地仓库历史后push失败的问题
问题根源
你用git clone --mirror克隆本地仓库得到镜像仓库后,往原仓库push时提示branch is currently checked out,是因为原仓库是普通非裸仓库,当前正处于某个分支的检出状态,Git禁止直接推送覆盖已检出的分支。
两种可行解决方案
方案一:直接在原仓库用BFG处理(更简单)
不用绕镜像仓库的弯路,直接在原仓库操作:
- 先备份原仓库:把整个仓库文件夹复制到其他位置,避免操作失误丢数据。
- 进入原仓库目录,确保没有未提交的更改:
- 有未提交修改的话先暂存:
git stash - 或者提交:
git commit -a -m "暂存更改"
- 有未提交修改的话先暂存:
- 执行BFG清理大文件(替换成你的大文件名):
java -jar bfg.jar --delete-files 你的大文件名.ext - 完成BFG的收尾清理:
git reflog expire --expire=now --all && git gc --prune=now --aggressive - 现在历史已经清理干净,直接强制推送到GitHub:
git push origin --force
方案二:继续用镜像仓库解决push报错
如果坚持用镜像仓库的方式,需要让原仓库暂时脱离分支检出状态:
- 进入你的原本地仓库,创建并切换到临时空分支:
git checkout --orphan temp-branch git rm -rf . git commit -m "临时占位提交" - 回到镜像仓库目录,执行推送:
git push - 推送完成后回到原仓库,切回原工作分支(比如
main),并删除临时分支:git checkout main git branch -D temp-branch - 执行收尾清理:
git reflog expire --expire=now --all && git gc --prune=now --aggressive - 推送到GitHub:
git push origin --force
重要提醒
- 强制推送前,确认没有其他协作者基于旧的提交历史工作,否则他们的后续提交会和清理后的历史冲突。
- 无论用哪种方案,备份原仓库都是第一要务!
内容的提问来源于stack exchange,提问作者Sheldonfrith
相关产品推荐
相关产品推荐

