本地项目已准备好推送到GitHub存储库。 GitHub存储库已初始化,没有README和许可证。
从提交C1
到Cn
- 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也不适合我。
答案 0 :(得分:0)
有几种方法可以做你想要的,但最重要的一点是:你无法无缝地使用Github repo 。因此,如果您打算将其用作分享新提交或从其他人那里获取贡献然后将其放回原始历史记录的方式,那么传统方式就不可能实现这一点。
最简单的方法是将您的所有文件复制到您的工作树中,处于您想要的存储库状态,init
作为一个新的git repo,进行一次初始提交,然后将所有内容推送到Github上。
您将能够正常使用新的回购,并且不会共享或保留原始历史记录。
另一种选择是在当前的repo上创建一个新的分支,作为 orphan ,即一个没有root的分支,并执行与上面创建新repo相同的事情 - 复制文件,制作一个新的启动提交,并将此分支推送到Github。
然后,您将能够共享和获取在公共存储库上进行的更改,但是将它们返回到主分支将更加困难 - 您可以使用单向合并到私有分支中,并使所有仅在公共分支上编辑,这将保留您的历史记录而不共享它。
如果您想采用这种方法,那么您需要非常小心地使用合并方向 。如果您向错误的方向推送合并,则历史记录将变为公开。
有关详细信息,请参阅此问题: Push a branch of a git repo to a new remote (github), hiding its history
Ben Jackson在上述问题的答案中解释了这一点:提交的哈希部分基于回购中它前面的每个提交。既然你想要做的就是公开创建一个新的提交(没有父级),git将拒绝将它视为真正的旧提交,因为哈希不会匹配。