两个具有不同历史记录的git遥控器

时间:2020-01-24 14:38:37

标签: git github

我们有一个内部公司github存储库,我们希望不久将其开源至github.com。为了安全地执行此操作,我们希望在首次推送到公共仓库时删除git历史记录。因此,我们需要:

  1. 创建一个公共存储库,将其添加为本地github存储库的第二个远程存储库
  2. 将本地代码的历史记录截断版本推送到公共仓库
  3. 确保所有后续落实都在本地存储库和公共存储库中结束

例如,如果首次公开发布时的本地历史是:

A -> B -> C -> D

然后,首次推送后的公共回购应如下所示:

D

添加两个新的提交E和F后,两个存储库应分别如下所示:

本地:

A -> B -> C -> D -> E -> F

公共:

D -> E -> F

我们如何尽可能轻松地同时实现所有这些功能?我意识到,关于缩短历史记录或使用多个遥控器,存在很多疑问/答案,但是我什么也没发现同时了解这两个功能。

1 个答案:

答案 0 :(得分:0)

一种解决方案是为您的公共存储库创建初始提交,并使用 git replace --graft 将您的内部历史和公共历史绑定在一起。我个人认为这个解决方案在您在问题中描述的类似情况下非常有用。在这种情况下,历史记录将如下所示:

您内部 Github 存储库中的历史记录:

A -> B -> C -> D -> I (replaced) -> E -> F

公共 Github 存储库中的历史记录:

I -> E -> F

其中提交 EF 是新开发的,而 I 是公共存储库的初始提交。

实现此目的的步骤(假设 master 是所有 repos 中的主分支):

  • 在您声明的时候,您正在提交 D
  • 将文件复制到新文件夹并为您的公共存储库创建初始提交 I
  • 将初始提交推送到您的(空)公共存储库
  • 返回到旧的本地存储库并添加新的公共远程
  • 将初始提交从公共存储库拉到新分支
  • 检查提交 DI 的哈希值
  • 运行git replace --graft hash_of_commit_I hash_of_commit_D
  • 当您运行 git show-ref 时,您会看到参考 refs/replace/*
  • git log 将在提交 replaced 时显示 I 标记
  • 将新分支合并到 master(I 到 master)
  • 将新引用推送到您的内部存储库 git push internal_remote 'refs/replace/*'
  • 将初始提交推送到您的内部存储库 git push internal_remote HEAD:master
  • 此时可以删除新的分支
  • 推送到公共仓库不应该做任何事情 git push public_remote master,应该只有初始提交 I 并且没有以前的历史
  • 现在您可以进行新的开发并推送到两个遥控器,而不会弄乱历史!
  • git commit
  • git push internal_remote master
  • git push public_remote master