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

问题描述 投票:0回答:1

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

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

但是解决方案没有解决的问题是,我可以及时跳回来查看指定提交中的所有文件,其中存在两个子目录。

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

这是我目前的设置:两个独立开发的存储库:

  • apprepo
  • librepo

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

  • / app / - >来自apprepo
  • / lib / - >来自librepo
  • /数据/
  • /配置/

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

如果我使用众多“merge x repos to a repo”中的一个-solutions,那么在查看该提交的目录树时,我将最终得到两种状态之一:

  • 文件未在历史记录中移动 - 在apprepo中提交:只有apprepo中的文件可见并显示在根目录下。在librepo中提交:只有apprepo中的文件可见并显示在根目录下
  • 在历史记录中移动的文件 - 在apprepo中提交:只有包含apprepo中所有文件的subdir app才可见。 librepo中的Commit仅显示了libirpo中所有文件的subdir lib。

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

很久以前,当从SVN迁移到git时,我通过读取这两个历史记录并“重放”提交来管理这样的事情,就好像子目录总是在那里一样。

有没有办法解决这个特殊问题,还是我真的不得不忍受丢失的标签和“不完整”的历史?

git merge git-subtree monorepo
1个回答
0
投票

TLDR;经过另一整天的讨论,我解决了最不利的问题。来自https://stackoverflow.com/a/14470212/11126816的子树合并策略和来自https://stackoverflow.com/a/43340503/11126816的git filter-branch的组合

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

© www.soinside.com 2019 - 2024. All rights reserved.