【问题标题】:Replacing the Prod Repo after rewriting git history?重写 git 历史记录后替换 Prod Repo?
【发布时间】:2015-01-01 20:29:49
【问题描述】:

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

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

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

或者,如果我制作热门的生产模式以推送到 repo,我会遇到麻烦吗? (这是一个非常古老的项目,有很多不好的做法。我让没有 git 技能的开发人员直接在 prod 中工作。)

【问题讨论】:

  • 如果你重写了历史,那么你需要强制推送。但是我真的不明白您所说的“拉入此产品目录将无济于事,我可以直接从那里推回吗?”。为什么您需要从生产结账中推迟? (为什么这与您的问题有关?)
  • 澄清了这个问题。我相信我推回 GitHub 的裸仓库会替换所有 refs(因此是强制推送?)。但后来我在生产中得到了这个现有的原始目录/repo 克隆,我将推入和拉出。使用 BFG,我在与原始产品 repo 无关的完全不同的位置重写了历史。所以我想确保我不会看到所有内容都“更改但未更新”。
  • 好吧,您将无法更新您的产品结帐,因为它现在是完全不同的历史。您需要创建一个全新的结帐。
  • 看来变基可以解决问题? help.github.com/articles/remove-sensitive-data

标签: git git-rewrite-history


【解决方案1】:

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

  1. 您的本地副本,用 BFG 清理
  2. GitHub 上的副本
  3. 生产副本,我猜它位于某处的实时服务器上

您已准备好将已清理的 本地 历史记录推送到 GitHub,但您想知道针对 生产。我假设 local、GitHub 和 production 在您开始之前都是同步的。

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

取而代之的是获取更改,告诉 Git 显式地将每个本地分支历史记录强制为新的、已清理的版本:

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

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

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

【讨论】:

  • 遇到问题: * 在本地忽略有趣的 ref 'HEAD',拒绝获取非裸存储库的当前分支 refs/heads/master。这是git版本问题吗? git 版本 1.7.1
  • 用 2.2 试过,没有骰子。 git fetch origin -f (no :) 是否有效,但尝试推回导致旧的 cruft 仍在 repo 中。
  • @ijames 更新了答案以添加 --update-head-ok 标志 - 感谢您指出问题!
猜你喜欢
  • 2020-05-30
  • 2013-02-05
  • 2015-06-04
  • 2022-06-14
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-13
相关资源
最近更新 更多