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


335

我有一个项目在一个子模块 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文件中的条目的组合。最近有一个问题。试图找到它...
卡斯卡贝尔


@Jefromi-我在.git文件夹中的任何位置都找不到该路径的提及。这样做grep -r "Classes/Support/Three20" *.*也不会产生任何结果
Ben Scheirman 2010年

2
@Ben:为什么要在.git文件夹中搜索该文本?那不是git存储内容的方式。如果您真的想验证git的想法,请尝试git ls-tree HEAD Classes/Support,并且如果它说Three20是一次提交,则那里有一个gitlink。如果有,请按照上面链接的VonC问题中的相应说明进行操作,以将其转换为适当的子模块,或将其转换为定期跟踪的内容。
卡斯卡贝尔

2
对于将来的访问者,如果您的问题链接到已删除的子模块并且heroku 引发错误,请从github.com/heroku/heroku-repo安装heroku-repo 和heroku repo:reset -a appname
fadomire

Answers:


309

按照rajibchowdhury回答(已更新),建议使用usegit rm命令来删除索引中指示子模块特殊条目(带有特殊模式的“文件夹” 160000)。

如果未在(如原始问题中的' ')中引用该特殊输入路径,则需要将其删除,以避免.gitmoduleClasses/Support/Three20.gitmodules路径中未 ”错误消息。

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

git ls-files --stage | grep 160000

上一个答案(2010年11月)

您可能未正确声明初始子模块(即,如我的旧答案所述,末尾没有任何尾部'/' ,即使您.gitmodule路径看起来不错)。

这个线程提到:

从新克隆运行'git submodule init'时会遇到相同的错误吗?
如果是这样,则说明您有问题。

如果您没有子模块,请.gitmodules在.git / config中删除,以及对子模块的任何引用,并确保Pikimal目录中没有.git目录。
如果这样可以解决问题,请签入并在邮轮工作副本上进行相同的操作。

显然,不要删除您的主.gitmodules文件,而是要照顾其他.gitmodules工作树中的文件。


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

请参阅如何跟踪未跟踪的内容?为了将这样的目录转换为真实的子模块。


5
我没有任何.gitmodules文件,每次结帐/拉取时我仍然收到此消息。我该怎么办?
aaronbauman


4
@aaronbauman是的,您需要删除gitlink,因此git rm xxx(不带斜杠)git rm --cached允许您将其保留在磁盘上,同时将其从索引中删除。
VonC

运行git ls-files之后--stage | grep 16000,我发现了一些条目。如何删除这些?
约翰·麦克

1
@JohnMike(如果您.gitmodule引用这些条目),则stackoverflow.com/a/16162000/6309。如果不是,那么简单git rm afolder(没有尾随/斜杠)
VonC

412

在.gitmodules中找不到路径'OtherLibrary / MKStore'的子模块映射,当

$ git submodule update --init

我不知道为什么会发生错误。花了一分钟后,在stackoverflow中找到了答案。

$ git rm --cached OtherLibrary/MKStore

然后再次更新子模块。一切正常。

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


2
在编辑.gitmodules文件以通过git:// links更改https://链接后,它为我工作
Diwann 2013年

1
这对我也很有效,但是我必须确保子模块路径的末尾没有斜杠。
彼得2014年

我不敢相信我忘记了init选项。如果克隆项目,则应先启动子模块,然后再进行更新。
亚历克斯2015年

不得不在仓库的根目录中运行它,然后一切正常。谢谢!
Pwdr

非常感谢您的rm命令。我打电话git submodule sync | grep "mapping found",然后git rm又一次git submodule sync。问题消失了!
2013年

24

当我使用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]

事实证明,如果要克隆master分支,则不应使用--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]

9

我尝试在我的仓库的新签出中尝试“ git submodule init”后遇到此错误。原来,我最初用错误的情况指定了模块子文件夹。由于我在Mac上使用区分大小写的文件系统(hurr),因此失败了。例如:

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

成功,但问题在于磁盘上的路径是

Myapp/Resources/Project

我不明白的是为什么git会将模块初始化到错误的文件夹(忽略命令中的错误情况),然后随后的命令正确运行(失败)。


在这里(Windows)也一样,尽管我不明白为什么。您应该可以为结帐指定一个带有不同大小写的文件夹,并且这不会更改模块名称。
Xavier Poinas,2015年

6

只要git rm subdir 都会好的。这将删除子目录作为索引。


5

刚遇到这个问题。有一段时间,我尝试了有关删除路径,git删除路径,删除.gitmodules,从.git / config中删除条目,向后添加子模块,然后提交并推送更改的建议。令人费解的是,当我执行“ git commit -a”时,它看起来似乎没有变化,因此我尝试仅推动移除,然后推动readdition使它看起来像是变化。

一段时间后,我偶然发现,删除所有内容后,如果我运行“ git submodule update --init”,则会收到一条有关特定名称的消息,git应该不再引用该名称:子模块的存储库名称链接到,而不是它签出的路径名。Grepping发现此引用位于.git / index中。所以我运行了“ git rm --cached repo-name”,然后读取了模块。当我这次提交时,提交消息包含一个更改,即它正在删除此意外对象。之后,它可以正常工作。

不知道发生了什么,我猜是有人滥用了git submodule命令,也许是颠倒了参数。甚至可能是我...希望这对某人有帮助!


5

在文件.gitmodules中,我替换了字符串

"path = thirdsrc\boost" 

"path = thirdsrc/boost", 

它解决了!--


谢谢解决我的问题。可能是在Windows中发生的问题。在我的情况下,路径为“ path = something \\ folder”
Roozbeh G

当我在Windows上使用git-lfs而不是git时遇到错误时,这对我有用。(使用标准git时未发生错误)
frage

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子模块


3

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

  1. 将dirA-xxx移到dirB-xxx
  2. 修改.gitmodules中的条目以使用dirB-xxx
  3. 修改.git / config中的条目以使用dirB-xxx
  4. 修改.git / modules / dirA-xxx / config以反映正确的目录
  5. 修改dirA-xxx / .git以反映正确的目录
  6. git submodule status

    如果返回错误:.gitmodules中找不到路径dirA-xxx的子模块映射。这是由于dirA-xxx不存在,但仍由git跟踪。通过以下方式更新git索引:git rm --cached dirA-xxx

    试试看git submodule foreach git pull。我没有经过git子模块结构的实际研究,因此上述步骤可能会破坏某些内容。尽管如此,通过上述步骤,目前情况看起来不错。如果您有任何见解或适当的步骤来完成任务,请在此处分享。:)


1

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

在CMS上工作时,可以为特定模块/插件安装带有git元数据的.git /目录的模块/插件

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


1

在查看了我的之后.gitmodules,原来我确实有一个大写字母,而我本来应该没有。因此请记住,.gitmodules目录区分大小写


1
您确定不是故意的.gitmodules吗?
Serhii Kheilyk,

0

在我的情况下,该错误可能是由于具有不同子模块配置的两个分支上的.gitmodules之间的错误合并所致。在从该论坛获得建议后,我解决了手动编辑.gitmodules文件的问题,添加丢失的子模块条目非常容易。之后,命令git submodule update --init --recursive正常工作。


0

对我们来说,问题在于重复的子模块条目已添加到.gitmodules中(可能是通过合并)。我们在.gitmodules中搜索git抱怨的路径,并找到了两个相同的部分。删除其中一个部分可以为我们解决问题。

值得一提的是,git 1.7.1给出了“无子模块映射”错误,但git 2.13.0似乎并不在乎。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.