Git将子模块合并到父树中,并保留提交历史记录

Git merge submodule into parent tree cleanly and preserving commit history

我有一个存储库,其中包含两个子模块,我想将其转换为单个项目。许多答案都涉及脚本,有些似乎过于复杂。

1
2
3
4
5
6
7
8
9
10
[submodule"site"]
    path = wp-content/themes/site
    url = https://[email protected]/ajf-/site.git
    fetchRecurseSubmodules = true
    ignore = all
[submodule"wpsite"]
    path = wp-content/themes/wpsite
    url = https://[email protected]/ajf-/wpsite.git
    fetchRecurseSubmodules = true
    ignore = all

是否有官方支持/记录的方式将这些子模块合并到父存储库中?


最好的方法是进行子树合并。

首先,从父项目中删除子模块和相关配置;编辑.gitmodules文件以删除受影响的子模块,或者如果要合并所有子模块,则完全删除该文件。同时删除子模块目录。

接下来,将子模块存储库作为适当的远程设备添加到您的超级项目中:

1
2
git remote add site https://[email protected]/ajf-/site.git
git remote add wpsite https://[email protected]/ajf-/wpsite.git

然后,取出遥控器:

1
git fetch --all

现在,从每个子项目中检查要移植到主项目的分支:

1
2
git checkout -b site-branch site/some_branch
git checkout -b wpsite-branch wpsite/some_other_branch

现在可以将这些分支作为子树与主项目合并:

1
2
git read-tree --prefix=site/ -u site-branch
git read-tree --prefix=wpsite/ -u wpsite-branch

你完成了。用gitk --all检查结果。

由于您希望转换为单个项目,所以您不会独立地更新子项目,所以我不会描述它是如何工作的。

你可以在pro git的子树合并一章中阅读到这一点。