【发布时间】:2012-03-20 05:24:44
【问题描述】:
我有两个不相关(不共享任何祖先签入)的 Git 存储库,一个是一个超级存储库,其中包含许多较小的项目(我们称之为存储库 A)。另一个只是一个小型项目的临时本地 Git 存储库(我们称之为存储库 B)。从图形上看,它看起来像这样
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)
理想情况下,我真的很想将 repo B 合并到 repo A 中,并使用一个历史时间线。所以看起来我最初是在 repo A 中开始项目的。从图形上看,这将是理想的最终结果
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 命令来处理主树和子树/模块分支之间的签入和同步。这两种解决方案还会产生多个时间线(使用子树时,您甚至可以在使用 --squash 时获得 3 个单独的时间线)。
最接近 SO 的解决方案似乎是在谈论“graft”,但真的是这样吗?目标是拥有一个统一的存储库,我可以在其中拉入/推送签入,这样就没有更多的 repo B,最后只有 repo A。
【问题讨论】:
-
@MichaelDurrant 不,我拒绝子树和子模块解决方案,因为场景不一样