我有一个包含两个子模块的存储库,我想将其转换为单个项目。许多答案涉及脚本,有些似乎过于复杂。
[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
是否有正式支持/记录的方法将这些子模块合并到父存储库中?
答案 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
检查结果。
由于您希望转换为单个项目,因此您不会单独更新子项目,因此我不会描述其工作原理。
中阅读此内容答案 1 :(得分:6)
聚会晚了一点,但是对于仍在寻求帮助的人,请查看以下内容:
下面是第一篇文章的逐字记录副本:
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
有了这个子模块的历史记录就可以保存完了。