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

时间:2014-04-27 19:06:04

标签: git git-submodules

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

[submodule "site"]
    path = wp-content/themes/site
    url = https://ajf-@bitbucket.org/ajf-/site.git
    fetchRecurseSubmodules = true
    ignore = all
[submodule "wpsite"]
    path = wp-content/themes/wpsite
    url = https://ajf-@bitbucket.org/ajf-/wpsite.git
    fetchRecurseSubmodules = true
    ignore = all

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

2 个答案:

答案 0 :(得分:18)

最好的方法是子树合并

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

接下来,将子模块存储库添加为超级项目的正确遥控器:

git remote add site https://ajf-@bitbucket.org/ajf-/site.git
git remote add wpsite https://ajf-@bitbucket.org/ajf-/wpsite.git

然后,获取遥控器:

git fetch --all

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

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

您现在已准备好将这些分支合并为子树与您的主项目:

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

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

由于您希望转换为单个项目,因此您不会单独更新子项目,因此我不会描述其工作原理。

您可以在chapter on subtree merging from Pro Git

中阅读此内容

答案 1 :(得分:6)

聚会晚了一点,但是对于仍在寻求帮助的人,请查看以下内容:

  1. https://gitirc.eu/howto/using-merge-subtree.html
  2. https://help.github.com/en/github/using-git/about-git-subtree-merges

下面是第一篇文章的逐字记录副本:

1. git remote add -f Bproject /path/to/B
2. git merge -s ours --no-commit --allow-unrelated-histories Bproject/master
3. git read-tree --prefix=dir-B/ -u Bproject/master
4. git commit -m "Merge B project as our subdirectory"

5. git pull -s subtree Bproject master

说明

1. name the other project "Bproject", and fetch.
2. prepare for the later step to record the result as a merge.
3. read "master" branch of Bproject to the subdirectory "dir-B".
4. record the merge result.

5. pull in subsequent update from Bproject using "subtree" merge

作为第4步之前的替代方法,您可能想要更新.gitmodules文件,或只是将其删除:

3.1 git rm --cached .gitmodules

有了这个子模块的历史记录就可以保存完了。