对Git子模块进行非子模块化,将所有代码带回核心存储库的最佳实践是什么?


当前回答

在主回购

Git rm——缓存[submodules_repo] git commit -m "Submodules removed." Git push origin [master]

在子模块repo

Rm -rf .git

还是主回购

Git add [submodules_repo] Git添加。 Submodules repo被添加到main中。 Git push origin [master]

其他回答

在主回购

Git rm——缓存[submodules_repo] git commit -m "Submodules removed." Git push origin [master]

在子模块repo

Rm -rf .git

还是主回购

Git add [submodules_repo] Git添加。 Submodules repo被添加到main中。 Git push origin [master]

从git 1.8.5(2013年11月)开始(没有保留子模块的历史):

mv yoursubmodule yoursubmodule_tmp
git submodule deinit yourSubmodule
git rm yourSubmodule
mv yoursubmodule_tmp yoursubmodule
git add yoursubmodule

将:

注销和卸载(即删除子模块的内容)(deinit,因此mv先), 清理你的。gitmodules (rm), 并删除父repo (rm)索引中表示子模块SHA1的特殊条目。

一旦子模块的删除完成(deinit和git rm),您可以重命名文件夹为原来的名称,并将其作为常规文件夹添加到git repo中。

注意:如果子模块是由旧Git(< 1.8)创建的,您可能需要删除子模块本身中嵌套的.git文件夹,正如Simon East所评论的那样


如果你需要保留子模块的历史,请参阅jsears的答案,它使用git filter-branch。

我找到的最佳答案是:

http://x3ro.de/2013/09/01/Integrating-a-submodule-into-the-parent-repository.html

这篇文章很好地解释了这个过程。

基于VonC的回答,我创建了一个简单的bash脚本。最后的add必须使用通配符,否则它将撤销子模块本身先前的rm。重要的是要添加子模块目录的内容,而不是在add命令中命名目录本身。

在一个名为git- integration -submodule的文件中:

#!/usr/bin/env bash
mv "$1" "${1}_"
git submodule deinit "$1"
git rm "$1"
mv "${1}_" "$1"
git add "$1/**"

Git rm——缓存了the_submodule_path 从.gitmodules文件中删除子模块部分,或者如果它是唯一的子模块,则删除该文件。 执行一个提交"removed submodule xyz" Git添加了_submodule_path 另一次提交“添加xyz的代码库”

我还没找到更简单的方法。你可以通过git commit -a把3-5压缩到一个步骤中——这取决于你的喜好。