如何将Git子模块替换为其文件内容且不破坏同事仓库?
解决Git子模块转本地目录后的拉取冲突问题
为啥会出问题?
你之前的操作只处理了.gitmodules文件和工作区的子模块目录,但Git子模块的核心元数据还藏在仓库的.git/config和.git/modules文件夹里。同事本地的build/sub还是被Git标记成子模块,拉取新代码时,Git觉得远程要覆盖子模块里的文件,就抛出了冲突错误;而git reset --hard没用是因为子模块是独立的小仓库,主仓库的重置管不到它。
给同事的修复步骤(不搞坏本地仓库)
让同事按下面的步骤来:
- 先把本地未提交的修改存起来(怕丢):
git stash - 取消
build/sub的子模块标记:git submodule deinit -f build/sub - 删除Git后台存的子模块元数据:
rm -rf .git/modules/build/sub - 删掉主仓库配置里的子模块条目:
git config --remove-section submodule.build/sub - 现在可以安全拉取并同步远程最新代码了:
git fetch origin git reset --hard origin/master - 之前存的修改要恢复的话:
git stash pop
正确的子模块转本地目录流程(避免再踩坑)
如果要重新做这个替换,按下面的标准步骤来:
- 先把子模块同步到最新状态:
git submodule update --init --recursive build/sub - 把子模块内容复制到仓库外面的临时目录(避免Git干扰):
cp -r build/sub ../temp-sub - 彻底清理子模块的所有痕迹:
git submodule deinit -f build/sub git rm -f build/sub rm -rf .git/modules/build/sub git config --remove-section submodule.build/sub - 把临时目录的内容移回原位置:
mv ../temp-sub build/sub - 提交并推送到远程:
git add build/sub git commit -m "替换子模块build/sub为本地文件" git push origin master
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

