将SVN项目迁移至Git时添加Submodule遇init错误求助
解决Git子模块初始化错误:
fatal: No url found for submodule path 'external1' in .gitmodules 你的问题核心出在**git submodule add命令的参数顺序完全搞反了**,导致Git生成的.gitmodules文件没有正确记录子模块的仓库URL,所以执行git submodule init时会出现找不到URL的错误。
错误原因拆解
你执行的命令是:
git submodule add C:/hubert/compo1 C:/hubert/compo1/external1 git submodule add C:/hubert/compo1 C:/hubert/compo1/external2
但git submodule add的正确语法是:
git submodule add <子模块仓库的URL/本地路径> <主项目中存放子模块的目标路径>
你把主项目路径当成了子模块的仓库地址,还重复指定主项目目录作为前缀,完全不符合命令要求,自然会让.gitmodules文件缺失关键的URL配置项。
正确操作步骤
假设你的两个外部仓库的独立Git仓库路径分别是C:/hubert/external1_repo和C:/hubert/external2_repo,请按以下步骤修正:
进入主项目目录
cd C:/hubert/compo1清理现有错误文件(可选但推荐)
如果你已经把external1和external2文件夹放在主项目里,先把它们从主仓库的Git追踪中移除(记得先备份文件):git rm -r external1 external2 rmdir /s /q external1 external2 # Windows系统删除文件夹的命令,Mac/Linux用rm -rf external1 external2正确添加子模块
用正确的参数顺序关联子模块,本地仓库填本地路径,远程仓库填远程URL即可:# 将external1仓库关联到主项目的external1文件夹 git submodule add C:/hubert/external1_repo external1 # 同理添加第二个子模块 git submodule add C:/hubert/external2_repo external2初始化并更新子模块
现在执行初始化和更新命令就不会报错了:git submodule init git submodule update提交子模块配置
最后把.gitmodules文件和子模块的引用记录提交到主仓库:git add .gitmodules external1 external2 git commit -m "Add external1 and external2 as submodules"
补充说明
.gitmodules是存储子模块配置的核心文件,正确的配置格式应该类似这样:
你之前的错误命令生成的文件肯定缺失了[submodule "external1"] path = external1 url = C:/hubert/external1_repo [submodule "external2"] path = external2 url = C:/hubert/external2_repourl字段,这就是报错的根本原因。- 如果你的外部仓库原本就克隆在主项目目录下,建议把它们移到主项目目录之外,避免路径嵌套带来的混淆,再按上述步骤添加子模块。
内容的提问来源于stack exchange,提问作者Emile




