How to combine two separate unrelated Git repositories into one with single history timeline
我有两个不相关(不共享任何祖先签入)的Git存储库,一个是由许多较小的项目组成的超级存储库(我们称之为存储库A)。另一个只是一个小型项目的临时本地Git存储库(我们称之为存储库B)。从图形上看,应该是这样的
1 2 3 | A0-B0-C0-D0-E0-F0-G0-HEAD (repo A) A0-B0-C0-D0-E0-F0-G0-HEAD (remote/master bare repo pulled & pushed from repo A) A1-B1-C1-D1-E1-HEAD (repo B) |
理想情况下,我真的希望将回购B合并到回购A中,并有一个单一的历史时间表。所以看起来我最初是在repo a中启动项目的。从图形上看,这将是理想的最终结果。
1 2 | A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (new repo A) A0-A1-B1-B0-D1-C0-D0-E0-F0-G0-E1-H(from repo B)-HEAD (remote/master bare repo pulled & pushed from repo A) |
号
我一直在阅读子模块和子树(顺便说一句,pro-git是一本不错的书),但这两本书似乎都迎合了维护两个独立的分支的解决方案,子模块能够从上游提取更改,子树的头痛程度稍微小一些。这两种解决方案都需要额外的和专门的git命令来处理签入,并在主树和子树/模块分支之间进行同步。这两种解决方案也会导致多个时间线(使用子树时,甚至可以获得3个单独的时间线--挤压)。
最接近的解决方案似乎是"移植",但这真的是吗?我们的目标是拥有一个单一的统一存储库,在这里我可以拉/推签入,这样就没有更多的repo b了,最后只需要repo a。
我想你是这样做的:
希望这对你有用。
Br提姆
我做了类似的事情(将历史从B合并到A),比如: