在 .gitmodule 中找不到非子模块路径的子模块映射。

412

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

我的.gitmodule文件如下所示:

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

以前我已经克隆过这个项目,没有出现任何错误(先运行git submodule init,然后是git submodule update),而且它一直都能正常工作。

现在我尝试在新的机器上克隆这个项目,但是在执行git submodule init时出现了这个错误:

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

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

有什么想法吗?


1
听起来你可能已经成功将该路径添加为gitlink - 子模块是gitlink和.gitmoddules以及.git/config文件条目的组合。最近有一个关于此问题的提问; 正在尝试找到它... - Cascabel
11
@Jefromi:https://dev59.com/questions/G2855IYBdhLWcg3ww3Sa#4162672? - VonC
2
@Ben:你为什么要在.git文件夹中搜索那个text?这不是git存储内容的方式。如果你真的想验证git认为它是什么,请尝试git ls-tree HEAD Classes/Support,如果它说Three20是一个提交,则有一个gitlink。如果有,请按照VonC上面链接的问题的适当说明将其转换为正确的子模块或将其转换为常规跟踪内容。 - Cascabel
3
如果您的问题与已删除的子模块和Heroku抛出的错误有关,请从https://github.com/heroku/heroku-repo安装heroku-repo,并运行heroku repo:reset -a appname。 - fadomire
1
@ipatch 很好的观点。我已经在我的回答中引用了你的笔记,以增加可见性。 - VonC
显示剩余5条评论
19个回答

498

在路径“OtherLibrary/MKStore”下的.gitmodules文件中未找到子模块映射。

$ git submodule update --init

我不知道为什么出现错误,在花费一分钟时间后在stackoverflow中找到了答案。

$ git rm --cached OtherLibrary/MKStore

然后再次更新子模块。现在它运行良好。

http://en.saturngod.net/no-submodule-mapping-found-in-gitmodules


3
在编辑.gitmodules文件,将https链接改为git://链接后,它对我起到了作用。 - Diwann
1
这对我也起作用了,但我必须确保子模块路径末尾没有斜杠。 - peter
必须在仓库的根目录下运行此命令,然后一切都可以正常工作。谢谢! - Pwdr
2
非常感谢rm命令。我运行了 git submodule sync | grep "mapping found",然后执行了 git rm,最后再次运行了 git submodule sync。问题解决了! - Andrew
1
我的子模块在合并后出了问题,这是我找到的唯一解决方法。 - Fred
显示剩余3条评论

370

根据rajibchowdhury答案(已赞),使用git rm命令是用于删除索引中指示子模块(带有特殊模式160000的“文件夹”)的特殊条目

如果该特殊条目的路径没有在.gitmodules中引用(例如原问题中的'Classes/Support/Three20'),则需要将其删除,以避免出现“未找到.gitmodules中路径的子模块映射”错误消息。

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

git ls-files --stage | grep 160000

之前的答案(2010年11月):

可能你没有正确声明初始子模块(即没有以任何尾部'/'结尾,如我的旧答案所述),即使你的.gitmodules中的路径看起来没问题。

这个线程提到:

当你从一个新的克隆中运行'git submodule init'时,你是否遇到了相同的错误?
如果是这样,你有些地方出错了。

如果你没有子模块,请删除.gitmodules.git/config中对子模块的任何引用,并确保Pikimal目录中没有.git目录。
如果这解决了问题,请检查并在你的cruise工作副本上执行相同操作。

显然,不要删除您的主要.gitmodules文件,但需要关注工作树中的其他额外的.gitmodules文件。

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

请参阅如何跟踪未跟踪的内容?以将此类目录转换为真正的子模块:如ipatch所评论,并详细了解ipatch的注释中的细节:

If you run into the below error when working git submodules

mr-fancy-42-repo already exists in the index
  1. Remove the submodule folder / directory
  2. Remove the git cache for the folder / directory
  3. Then reinitialize submodule
rm -Rf /path/to/mr-fancy-42-repo
git rm -R /path/to/mr-fancy-42-repo
git submodule add [mr-fancy-42-submodule-repo] /path/to/initialize/submodule/repo

6
我没有任何.gitmodules文件,但每次进行checkout/pull操作时仍然收到此错误消息。我该怎么办? - aaronbauman
2
在这里找到了答案:https://dev59.com/G2Uq5IYBdhLWcg3wMNcK - aaronbauman
5
@aaronbauman 是的,你需要移除 git 链接,因此使用 git rm xxx(不带斜杠)来移除。git rm --cached 可以让你保留在磁盘上的文件,同时也将其从索引中删除。 - VonC
运行 git ls-files --stage | grep 16000 后,我发现了一些条目。如何删除它们? - John Mike
1
@JohnMike 如果你有一个引用这些条目的.gitmodule,请参考https://dev59.com/QHM_5IYBdhLWcg3wt1k0#16162000。如果没有,请使用简单的`git rm afolder`(不带尾部/斜杠)。 - VonC
显示剩余3条评论

26

当我使用 SourceTree 进行操作时,它会输出以下消息:
我遇到的消息:

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree submodule update --init --recursive
No submodule mapping found in .gitmodules for path 'SampleProject/SampleProject'
Completed with errors, see above

我的情况是我错误地应用了包含.git文件夹的项目目录。
SourceTree将此文件夹视为git子模块,但实际上不是。

我的解决方案是使用命令行将其删除。

$ git rm -r SampleProject --cached
$ git commit -m "clean up folders"

清除 Git 中的垃圾并保持其干净整洁。


17

我解决了这个问题。最初我尝试这样做:

git submodule add --branch master [URL] [PATH_TO_SUBMODULE]

事实证明,如果您想克隆主分支,则不应使用--branch选项的规范。这会引发以下错误:

fatal: Cannot force update the current branch.
Unable to checkout submodule '[PATH_TO_SUBMODULE]'

每次尝试执行

git submodule sync

将会抛出这个错误:

No submodule mapping found in .gitmodules for path '[PATH_TO_SUBMODULE]'

而且在.gitmodules中需要添加的行从未被添加。

所以对我来说,解决方案是这样的:

git submodule add [URL] [PATH_TO_SUBMODULE]

12
在文件.gitmodules中,我替换了字符串
"path = thirdsrc\boost" 
"path = thirdsrc/boost", 

问题已经解决! - -


谢谢,问题已解决。可能是在Windows中出现的问题。在我的情况下,路径是“path = something\folder”。 - Roozbeh G
当我在Windows上使用git-lfs而不是标准的git时遇到错误,这种方法对我有效。(使用标准git没有出现错误) - frage

10

我在尝试"git submodule init"新检出我的存储库后遇到了这个错误。 原来,我最初使用了错误的大小写指定了模块子文件夹。 由于我使用的是Mac并且具有区分大小写的文件系统,所以它失败了。 例如:

git submodule add git@github.com:user/project.git MyApp/Resources/Project
Cloning into 'MyApp/Resources/Project'

操作成功,但问题在于它在磁盘上的路径为

Myapp/Resources/Project

我不明白的是为什么git将模块初始化到错误的文件夹(忽略我的命令中的大小写错误),但随后的指令却能正常运行(失败)。


我的情况也一样(Windows),尽管我不明白为什么会这样。您应该可以自由地指定一个文件夹进行不同大小写的检出,而这不应该改变模块名称。 - Xavier Poinas

7

只需使用git rm subdir即可,这将从索引中删除subdir。


5

文件夹映射可以在.git/modules文件夹中找到(每个文件夹都有一个config文件,其中包含对其worktree的引用),因此请确保这些文件夹与.gitmodules.git/config中的配置相对应。

所以.gitmodules中有正确的路径:

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

.git/modules/<path>/config文件中的[core]部分,你需要正确填写<path>的路径,例如:

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

如果.git/modules中的正确文件夹丢失,则您需要进入子模块目录并尝试使用git reset HEAD --hardgit checkout master -f。如果这没有帮助,您可能想要删除所有指向损坏的子模块的引用,然后重新添加它,请参见:重命名git子模块

5
刚刚遇到了这个问题。 有一段时间我尝试了关于删除路径、git删除路径、删除.gitmodules、从.git/config中删除条目、重新添加子模块、然后提交和推送更改的建议。 令人困惑的是,当我执行“git commit -a”时,它看起来没有任何变化,所以我尝试只推送移除,然后推送重新添加,使其看起来像是变化。
过了一会儿,我偶然注意到,在删除所有内容后,如果我运行“git submodule update --init”,它会有一个关于特定名称的消息,而git不应该再引用该名称:子模块链接到的存储库名称,而不是检出的路径名称。通过grepping发现,这个引用在.git/index中。因此,我运行了“git rm --cached repo-name”,然后重新添加了模块。这一次提交时,提交消息包括删除此意外对象的更改。之后就可以正常工作了。
不确定发生了什么,我猜测有人误用了git子模块命令,可能是将参数颠倒了。甚至可能是我...希望这能帮助某个人!

4
文件夹结构
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接