在重写 git 历史后替换 Prod Repo?

Replacing the Prod Repo after rewriting git history?

我使用旧 The BFG 并按照描述的使用步骤清除了我的存储库中大文件的历史记录。所以我现在有一个干净的裸仓库准备被推回 GitHub。

生产目录是该存储库的克隆。

由于 HEAD 受到保护,这是否意味着原则上,在推送到 GitHub 之后,我将能够拉入现有的 prod 克隆并获得 "Already up-to-date." 消息,然后如果有必要,我还可以从那个 prod repo 干净地推回到 GitHub?

或者如果我制作热门生产模组以推送到回购协议,我会遇到麻烦吗? (这是一个非常古老的项目,其中包含许多不良做法。我有一些开发人员没有 git 技能直接在产品中工作。)

好的,为了了解您的设置,您的存储库有 3 个副本:

  1. 您的本地副本,已使用 BFG
  2. 清理
  3. GitHub 上的副本
  4. production 副本,我猜它在某处的实时服务器上

您已准备好将已清理的 local 历史推送到 GitHub,但您想知道您需要对 production 采取最低限度的行动。我假设 localGitHubproduction 之前都是同步的你开始了。

HEAD 提交的 BFG does protect the 'contents'(特别是文件树),但这并不意味着该提交的 历史。虽然它保证提交中的 files 不会改变,但 BFG 必须 改变历史才能完成它的工作。因为 Git 谨慎地将历史记录视为(通常)不可更改,所以您不能只是 git pull 这些更改通常进入您的 生产 副本 - 不同的历史记录将被 Git 注意到,然后被拒绝。您试图清除的所有垃圾也将被保留,如果您不小心,您可能会将其推回 GitHub。

取而代之的是获取更改,告诉 Git 明确强制每个本地分支历史记录到新的、清理过的版本:

$ git fetch origin *:* -f --update-head-ok

--update-head-ok标志是为了避免Refusing to fetch into current branch错误)

在那之后,您应该可以获取任何新的历史记录,如果需要的话,甚至可以将热门生产模组推送回 GitHub。