我们有一个内部公司github存储库,我们希望不久将其开源至github.com。为了安全地执行此操作,我们希望在首次推送到公共仓库时删除git历史记录。因此,我们需要:
例如,如果首次公开发布时的本地历史是:
A -> B -> C -> D
然后,首次推送后的公共回购应如下所示:
D
添加两个新的提交E和F后,两个存储库应分别如下所示:
本地:
A -> B -> C -> D -> E -> F
公共:
D -> E -> F
我们如何尽可能轻松地同时实现所有这些功能?我意识到,关于缩短历史记录或使用多个遥控器,存在很多疑问/答案,但是我什么也没发现同时了解这两个功能。
答案 0 :(得分:0)
一种解决方案是为您的公共存储库创建初始提交,并使用 git replace --graft
将您的内部历史和公共历史绑定在一起。我个人认为这个解决方案在您在问题中描述的类似情况下非常有用。在这种情况下,历史记录将如下所示:
您内部 Github 存储库中的历史记录:
A -> B -> C -> D -> I (replaced) -> E -> F
公共 Github 存储库中的历史记录:
I -> E -> F
其中提交 E
和 F
是新开发的,而 I
是公共存储库的初始提交。
实现此目的的步骤(假设 master 是所有 repos 中的主分支):
D
I
D
和 I
的哈希值git replace --graft hash_of_commit_I hash_of_commit_D
git show-ref
时,您会看到参考 refs/replace/*
git log
将在提交 replaced
时显示 I
标记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