将两个 git 个具有历史记录的存储库合并到子目录中,并假装文件始终存在

Merge two git repositories with history into subdirs and pretend the files where always there

我需要在不丢失历史记录的情况下将两个 git 个存储库合并到一个新的存储库中,并保留功能分支和标签。

这似乎是一个很常见的问题,已经解决了很多次(例如 https://github.com/unravelin/tomono or Merge two Git repositories without breaking file history)。

但是 none 的解决方案设法解决的是,我可以及时跳回并查看指定提交中的所有文件,其中两个子目录都存在。

所以我想知道 git 是否有可能实现这样的事情。

这是我当前的设置: 两个独立开发的仓库:

这些都被我们的构建系统(包括一些配置和数据目录)克隆并捆绑到 rpm 中

现在我想将两个存储库迁移到一个 "monorepo" 中,我还可以在其中存储配置和其他所需的基本子目录。

如果我使用众多 "merge x repos to a single repo" 解决方案中的一种,在查看该提交的目录树时,我将以两种状态之一结束:

这也使标签变得毫无用处。 我希望在任何提交时都可以看到 app 和 lib。

很久以前,当从 SVN 迁移到 git 时,我通过阅读历史和 "replaying" 提交来管理类似的东西,就好像子目录总是在那里一样。

是否有解决此特定问题的方法,或者我真的必须忍受丢失的标签和 "incomplete" 历史?

TLDR;在该主题上又花了一整天之后,我选择了缺点最少的解决方案。 来自 and git filter-branch from

的子树合并策略的组合

也许以下工具会对其他人有所帮助: