git子模块更新将忽略.gitmodules

时间:2018-09-19 21:12:09

标签: git git-submodules

我有一个带有子模块的git repo。主仓库的.gitmodule文件的内容是:

[submodule "wits-mercuryAPI"]
    path = wits-mercuryAPI
    url = https://github.com/myorganization/wits-mercuryAPI.git

我希望当我发出命令时...

  

git子模块更新

...它将从.gitmodule文件的url中指定的位置正确克隆子模块。但是,显然,它尝试使用此文件的较旧版本,其中url指向错误的url,因此失败。

对于我一生,我无法弄清楚为什么它会以这种方式运行,或者是什么神奇的隐藏属性告诉该命令访问.gitmodules文件的某些旧版本和不可见版本。

2 个答案:

答案 0 :(得分:0)

.gitmodules文件的内容仅在首次创建子模块Git存储库时使用。如果子模块存储库已经存在,Git只会继续使用现有克隆。

根据您使用的特定Git版本,子模块存储库本身可以位于超级项目的.git目录下的.git/modules/下,或者位于(较旧的Git版本)子模块本身。但是,无论哪种情况,如果子模块URL都已更改,则有两个选项:

  • 完全删除子模块(包括其.git/modules条目)并重新初始化;或
  • 输入子模块(足以输入路径)并使用git config更新此特定克隆,例如git config remote.origin.url <new-url>git config --edit在配置上打开编辑器。
  • li>

答案 1 :(得分:0)

好,我知道了。尽管我之所以没有提及它是因为我认为它不相关,但我在自己的问题中描述的“ repo”(简称为“ B”)本身是另一个更高级别的父存储库的子模块(我们称之为“ A”)。最后,我们将原始问题中描述的子模块称为“ C”。因此,依存关系为A-> B-> C。

发生了什么事: 1.我更新了B中的.gitmodules,以指向C的新正确URL,并将更改推送到master。 2.我错误地假设A会在执行以下操作时自动获取此更改:`git clone --recurse。 3.相反,A“记住”它指向的B版本,使用不正确的URL指向C的子模块版本。

此修复程序在这里:https://gist.github.com/ryannealmes/aa4eed8b222239c9e207