【问题标题】: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,但您想知道针对 生产。我假设 localGitHubproduction 在您开始之前都是同步的。

您的 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
相关资源
最近更新 更多