我有一个项目,在lib/three20有一个子模块

我的.gitmodule文件是这样的:

[submodule "lib/three20"]
    path = lib/three20
    url = git://github.com/facebook/three20.git

我克隆了这个在过去没有错误,(git子模块init紧随git子模块更新),它已经工作了一段时间。

我试图克隆这个到一个新的机器,现在我在git子模块init上得到这个错误:

No submodule mapping found in .gitmodules for path 'Classes/Support/Three20'

这个路径只是Xcode中的一个空文件夹,我用它来存放来自另一个目录的项目。它不是.gitmodules文件的一部分,所以我不知道它从哪里得到这个路径。

什么好主意吗?


当前回答

场景:将子模块从目录dirA-xxx更改为另一个目录dirB-xxx

move the dirA-xxx to dirB-xxx modify entry in .gitmodules to use dirB-xxx modify entry in .git/config to use dirB-xxx modify .git/modules/dirA-xxx/config to reflect the correct directory modify dirA-xxx/.git to reflect the correct directory run git submodule status if return error: No submodule mapping found in .gitmodules for path dirA-xxx. This is due to dirA-xxx is not existing, yet it is still tracked by git. Update the git index by: git rm --cached dirA-xxx Try with git submodule foreach git pull. I didn't go through the actual study of git submodule structure, so above steps may break something. Nonetheless going through above steps, things look good at the moment. If you have any insight or proper steps to get thing done, do share it here. :)

其他回答

文件夹映射可以在.git/modules文件夹中找到(每个文件夹都有参考其工作树的配置文件),因此确保这些文件夹对应于.gitmodules和.git/config中的配置。

因此.gitmodules有正确的路径:

[submodule "<path>"]
  path = <path>
  url = git@github.com:foo/bar.git

在[core]部分的.git/modules/<path>/config中,你有你的<path>的正确路径,例如。

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  worktree = ../../../<path>

如果在.git/modules中没有正确的文件夹,那么你必须去你的子模块目录并尝试git reset HEAD——hard或git checkout master -f。如果这没有帮助,你可能想删除所有对损坏子模块的引用,然后重新添加它,然后参见:重命名git子模块。

场景:将子模块从目录dirA-xxx更改为另一个目录dirB-xxx

move the dirA-xxx to dirB-xxx modify entry in .gitmodules to use dirB-xxx modify entry in .git/config to use dirB-xxx modify .git/modules/dirA-xxx/config to reflect the correct directory modify dirA-xxx/.git to reflect the correct directory run git submodule status if return error: No submodule mapping found in .gitmodules for path dirA-xxx. This is due to dirA-xxx is not existing, yet it is still tracked by git. Update the git index by: git rm --cached dirA-xxx Try with git submodule foreach git pull. I didn't go through the actual study of git submodule structure, so above steps may break something. Nonetheless going through above steps, things look good at the moment. If you have any insight or proper steps to get thing done, do share it here. :)

文件夹结构

xyz folder as root directory which contains 2 folder as submodule
  -- product
  -- user

从根目录执行以下命令

git rm --cached product/
git rm --cached user/

进入产品目录并执行

 git submodule update --init

进入用户目录并执行

git submodule update --init

再次进入根目录CD ..

git add --all

遵循rajibchowdhury的回答(被点了),使用git rm命令,建议删除索引中指示子模块的特殊条目(特殊模式为160000的“文件夹”)。

如果这个特殊的入口路径没有在.gitmodule中被引用(就像原始问题中的'Classes/Support/Three20'),那么你需要删除它,以避免“在.gitmodules for path中找不到子模块映射”错误消息。

你可以检查索引中所有引用子模块的条目:

git ls-files --stage | grep 160000

之前的回答(2010年11月)

有可能你没有正确地声明你的初始子模块(即没有任何结尾的'/',正如我以前的回答中所描述的,即使你的.gitmodule有看起来不错的路径)。

这个帖子提到:

当从一个新的克隆运行'git submodule init'时,你会得到相同的错误吗? 如果是这样,你就有问题了。 如果没有子模块,请删除.gitmodules,以及中对子模块的任何引用 .git/config,并确保Pikimal目录中没有.git目录。 如果这解决了问题,签入并在您的巡航工作副本上做同样的事情。

显然,不要删除你的主.gitmodules文件,但要照顾你工作树中其他额外的.gitmodules文件。


仍然在“不正确的子模块初始化”的主题中,Jefromi提到了实际上是gitlinks的子模块。

参见如何跟踪未跟踪的内容?以便将这样的目录转换为真正的子模块。

通常,git会在项目的根目录(.git/)中创建一个隐藏目录。

当你在CMS上工作时,你可能会安装带有.git/目录的模块/插件,其中包含特定模块/插件的git元数据

最快的解决方案是找到所有的.git目录,只保留根git元数据目录。如果这样做,git将不会将这些模块视为项目子模块。