git 在远程重写历史

git rewrite history on remote

免责声明:我敢肯定这个问题的标题已经引起了你所有的危险信号,并且让你想要激怒我或者给我一些解释为什么改写历史是一种严重的罪过。没关系,你可以这样做,但也请解决我的问题。

我在我的 git 回购中犯了一些非常非常严重的错误,导致它爆炸了好几千兆字节,哎呀!幸运的是,这是我自己的私人仓库,所以我仔细检查并重写了历史以删除所有错误。我关注了these instructions,基本上是:

  1. 找到我要删除的所有文件。
  2. 使用 git-filter-branch 删除它们。
  3. 从日志和引用中删除记录
  4. Re-garbage收藏。

这样做,我将存储库从几千兆字节减少到一个兆字节,耶!我跟进了 git push origin --force --all,一切都已成功更新。

现在,我想将我的存储库克隆到一个新系统中以测试我的重写是否有效。当我克隆时,我得到这个:

remote: Enumerating objects: 6359, done.
remote: Counting objects: 100% (6359/6359), done.
remote: Compressing objects: 100% (4857/4857), done.
fatal: The remote end hung up unexpectedly 1.70 GiB | 3.05 MiB/s

这对我来说似乎很奇怪。首先,我的repo不再是几千兆,只有1兆。此外,我没有 6539 objects。重写后,我只有2128 objects。在我推送重写之前它似乎正在下载 repo。

所以我的问题是:我怎样才能让远程仓库看到我重写了历史以使仓库小得多?

谢谢!

P.S。回购在 bitbucket 上。

仔细检查 bitbucket 上没有指向项目未过滤版本的旧分支。有可能,例如,bitbucket 保护 master 分支不被强制推送,所以它仍然指向旧代码。 运行 a git fetch then gitk --all --remotes on your old repo should be a good way to show you the state of the upstream repo.

即使有很多数据要下载,远端也不应该意外挂断。这听起来像是您的互联网连接或 bitbucket 的问题。

注意:在这种情况下重写历史是完全合理的事情,或者如果您已将机密或受 GDPR 保护的信息提交到您的存储库。