从特定提交开始将现有项目添加到 GitHub



本地项目已准备好推送到 GitHub 存储库。GitHub 存储库在没有自述文件和许可证的情况下初始化。

从提交C1Cn-C1是第一次/初始提交,Cn是第n次/最新提交 - ,本地项目包含敏感项目。但从提交Cn+1开始,敏感数据就会被屏蔽。

例如,C1..Cn+3是我当前的本地 git 存储库:

C1 < C2 < C3 < .. < Cn < Cn+1 < Cn+2 < Cn+3

我想将提交Cn+1向前推送。因此,远程存储库应该具有C1'..C3'

C1 < C2 < C3 < .. < Cn < Cn+1 < Cn+2 < Cn+3
C1' < C2' < C3'

远程仓库中的C1'在我的本地仓库中Cn+1

如何从提交Cn+1开始将本地项目添加到GitHub?以下推送应忽略提交C1..Cn

我已经尝试过git push origin <sha>:<branch>但它推动了整个项目。Rebase也不太适合我。

有几种方法可以做你想做的事情,但最重要的一点是:你将无法无缝使用 Github 存储库。因此,如果你打算使用它来分享新的提交或从其他人那里获取贡献,然后把它们放回你的原始历史记录中,这在传统方式中是不可能的。

创建新存储库

最简单的方法是复制包含所有文件的工作树,处于您想要的存储库状态,init作为新的 git 存储库,进行一次初始提交,然后将所有内容推送到 Github。

你将能够正常使用新存储库,并且不会共享或保留原始历史记录的任何内容。

创建公共分支

另一种选择是在当前存储库上创建一个新分支作为孤立分支,即一个没有根的分支,并执行与上面创建新存储库相同的操作 - 复制文件,进行新的开始提交,并将此分支推送到 Github。

然后,您将能够共享和获取在公共存储库上所做的更改,但将它们放回主分支将更加困难 - 您可以使用单向合并到私有分支中,并且仅在公共分支上进行所有编辑,这将保留您的历史记录而不共享它。

但是,如果要采用此方法,则需要非常小心合并方向。如果您将合并推向错误的方向,历史记录将公开。

有关详细信息,请参阅此问题: 将 git 存储库的分支推送到新的远程 (github),隐藏其历史记录

附录:为什么这不可能?

Ben Jackson 在上述问题的答案中对此进行了解释:提交的哈希部分基于存储库中它之前的每个提交。由于你想做的是公开创建一个新的提交(没有父提交),git 会拒绝把它当作你的旧提交,因为哈希不匹配。

最新更新