将两个 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 中
- /app/ -> 来自 apprepo
- /lib/ -> 来自 librepo
- /数据/
- /配置/
现在我想将两个存储库迁移到一个 "monorepo" 中,我还可以在其中存储配置和其他所需的基本子目录。
如果我使用众多 "merge x repos to a single repo" 解决方案中的一种,在查看该提交的目录树时,我将以两种状态之一结束:
- 历史记录中未移动的文件 - 在 apprepo 中提交:只有在 apprepo 中的文件可见并显示在根目录下。在 librepo 中提交:只有 apprepo 中的文件可见并显示在根目录下
- 历史记录中移动的文件 - 在 apprepo 中提交:只有包含 apprepo 中所有文件的子目录应用程序可见。在 librepo 中提交仅显示包含 librepo 中所有文件的子目录库。
这也使标签变得毫无用处。
我希望在任何提交时都可以看到 app 和 lib。
很久以前,当从 SVN 迁移到 git 时,我通过阅读历史和 "replaying" 提交来管理类似的东西,就好像子目录总是在那里一样。
是否有解决此特定问题的方法,或者我真的必须忍受丢失的标签和 "incomplete" 历史?
TLDR;在该主题上又花了一整天之后,我选择了缺点最少的解决方案。
来自 and git filter-branch from
的子树合并策略的组合
也许以下工具会对其他人有所帮助:
- https://metacpan.org/pod/git-stitch-repo :对此寄予厚望,但我们的存储库似乎过于复杂,算法无法处理分支/合并。我最终错过了太多的提交。也许有更多的线性存储库这可以工作
- https://github.com/shopsys/monorepo-tools : 也是一个不错的小帮手,似乎维护得更好。
我需要在不丢失历史记录的情况下将两个 git 个存储库合并到一个新的存储库中,并保留功能分支和标签。
这似乎是一个很常见的问题,已经解决了很多次(例如 https://github.com/unravelin/tomono or Merge two Git repositories without breaking file history)。
但是 none 的解决方案设法解决的是,我可以及时跳回并查看指定提交中的所有文件,其中两个子目录都存在。
所以我想知道 git 是否有可能实现这样的事情。
这是我当前的设置: 两个独立开发的仓库:
- 约
- 自由
这些都被我们的构建系统(包括一些配置和数据目录)克隆并捆绑到 rpm 中
- /app/ -> 来自 apprepo
- /lib/ -> 来自 librepo
- /数据/
- /配置/
现在我想将两个存储库迁移到一个 "monorepo" 中,我还可以在其中存储配置和其他所需的基本子目录。
如果我使用众多 "merge x repos to a single repo" 解决方案中的一种,在查看该提交的目录树时,我将以两种状态之一结束:
- 历史记录中未移动的文件 - 在 apprepo 中提交:只有在 apprepo 中的文件可见并显示在根目录下。在 librepo 中提交:只有 apprepo 中的文件可见并显示在根目录下
- 历史记录中移动的文件 - 在 apprepo 中提交:只有包含 apprepo 中所有文件的子目录应用程序可见。在 librepo 中提交仅显示包含 librepo 中所有文件的子目录库。
这也使标签变得毫无用处。 我希望在任何提交时都可以看到 app 和 lib。
很久以前,当从 SVN 迁移到 git 时,我通过阅读历史和 "replaying" 提交来管理类似的东西,就好像子目录总是在那里一样。
是否有解决此特定问题的方法,或者我真的必须忍受丢失的标签和 "incomplete" 历史?
TLDR;在该主题上又花了一整天之后,我选择了缺点最少的解决方案。 来自 and git filter-branch from
的子树合并策略的组合也许以下工具会对其他人有所帮助:
- https://metacpan.org/pod/git-stitch-repo :对此寄予厚望,但我们的存储库似乎过于复杂,算法无法处理分支/合并。我最终错过了太多的提交。也许有更多的线性存储库这可以工作
- https://github.com/shopsys/monorepo-tools : 也是一个不错的小帮手,似乎维护得更好。