Git:将存储库移动到另一个存储库的子文件夹

25

我有两个单独的 git 存储库(在 BitBucket 中):Repo ARepo B。我想将 Repo B 移动到 Repo A 的子文件夹中。同时,我还需要确保 Repo B 中的提交历史等信息得以保留不丢失。

如何使用 git 实现这一目标?


请更具体地说明,您是否要完全合并这两个代码库? - Michał Walenciak
@MichałWalenciak:是的,最好是这样。如果有一种方法可以不丢失提交历史记录。 - grizzthedj
2个回答

49

要将Repo B合并到Repo A中作为子文件夹,您需要在Repo A内运行以下命令:

git subtree add -P <prefix> <repo> <rev>

<prefix>设置为子目录的名称,将<repo>设置为Repo B的克隆URL,将<rev>设置为您想要的Repo B的修订版本(如果是最新的则为HEAD)

这将获取Repo B的历史记录并将其与Repo A合并,同时包括一个额外的合并提交。


3
针对任何在搜索如何将Repo A的子文件夹移动到Repo B的子文件夹时遇到问题的人,我通过首先遵循GitHub中关于将子文件夹分离出另一个存储库的文章(唯一的区别是我为此创建了一个本地存储库,因此我在第5步停止并将其推送到我的本地仓库)来解决了这个问题。然后我按照这个答案将其推送到了一个子文件夹中:<prefix>="My/Sub/Directory with spaces",它非常有效! - Chris
1
我该如何更新存储库A中的存储库B?我只需要再次执行此操作以进行更新吗? - Kennet Celeste
3
这不应该被投票为顶部评论。发帖人要求保存所有提交记录,而你的解决方案丢失了所有提交记录。 - Stav Alfi
@StavAlfi 你确定吗...?我刚在一个测试的git仓库中尝试了这个,我将子仓库克隆到父仓库的一个子目录中,所有子仓库的历史记录都被复制到了父仓库中(在一个新建的分支中),这正是我想要的(也是我认为OP想要的)。 - Jake Levi
我想我能够猜到这个问题的答案,但只是想确认一下:如果仓库B被删除了,那么仓库A子目录中的内容和Git历史记录是否会无限期地保留下来? - Jake Levi
显示剩余2条评论

3

这不是在BitBucket中完成的,而是使用git完成的。您需要执行以下步骤:

  • 将Repo B提取到已克隆的Repo A中。 Git可能会对此发出警告,但仍要执行此操作。
  • 检出该提取的代码(此时您仅拥有来自Repo B的代码),并将其全部移动到所需的子文件夹中。提交更改。
  • 再次检出您的Repo A代码,并合并您刚刚创建的提交。

1
这将不会转移Repo A的提交历史记录。 - Guilherme Bernal
它将保持两者作为合并提交的独立“父级”。 - aragaer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接