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

时间:2019-02-28 07:18:52

标签: git merge git-subtree monorepo

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

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

但是,所有解决方案都无法解决的是,我可以跳回过去并查看来自指定提交的两个子目录都存在的所有文件。

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

这是我当前的设置: 分别开发了两个存储库:

  • apprepo
  • librepo

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

  • / app /->来自apprepo
  • / lib /->来自librepo
  • / data /
  • / config /

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

如果我使用许多“将x仓库合并到一个仓库”之一,那么在查看该提交的目录树时,我将最终处于两种状态之一:

  • 历史记录中未移动的文件-在apprepo中提交:仅可见apprepo中的文件,并显示在根目录下。在librepo中提交:仅可见apprepo中的文件,并显示在根目录下
  • 在历史记录中移动的文件-在apprepo中提交:仅显示具有apprepo中所有文件的subdir应用程序。在librepo中提交,仅显示subdir lib以及librepo中的所有文件。

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

很久以前,当从SVN迁移到git时,我通过读取历史记录并“重播”提交,就像子目录始终存在一样,来管理类似的事情。

是否有解决此特定问题的方法,还是我真的必须忍受丢失的标签和“不完整的”历史记录?

1 个答案:

答案 0 :(得分:0)

TLDR;在该主题上花了整整一天的时间之后,我以最小的缺点解决了这个问题。 来自https://stackoverflow.com/a/14470212/11126816的subtree-merge-strategy和来自https://stackoverflow.com/a/43340503/11126816的git filter-branch的组合

也许以下工具可以帮助其他人: