.gitmodule中找不到子模块的path的子模块映射

我有一个在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' 

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

有任何想法吗?

2013年11月更新:

在rajibchowdhury的回答 (upvoted)之后,build议的git rm用于删除索引中指示子模块 (特殊模式为“ 160000 ”的“文件夹”)中的特殊条目

如果没有在.gitmodule引用特殊的入口path (如原始问题中的“ Classes/Support/Three20 ”),则需要将其删除,以避免在No submodule mapping found in .gitmodules for path ” “ 错误信息。

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

 git ls-files --stage | grep 160000 

原文答案(2010年11月)

你是否正确地声明了你的初始子模块? (即没有任何尾巴'/'在最后,如我的旧回答中所述 ,即使你的.gitmodulepath看起来不错)。

这个线程提到:

当你从一个新的克隆运行'git submodule init'时你会得到同样的错误吗?
如果是这样,你有什么问题。

如果没有子模块,请删除.gitmodules以及对.git / config子模块的引用,并确保Pikimal目录中没有.git目录。
如果解决了这个问题,请检查您的巡航工作副本并执行相同的操作。

显然,不要删除主要的.gitmodules文件,而是在工作树中查看其他额外的.gitmodules文件。


仍然在“不正确的子模块初始化”的话题中, Jefromi提到了实际上是gitlinks的子模块。
请参阅“ Git – 如何跟踪未跟踪的内容? ”以了解如何将这样的目录转换为真实的子模块。

在'OtherLibrary / MKStore'时,在.gitmodules中找不到子模块映射

 $ git submodule update --init 

我不知道为什么发生错误。 花了一分钟后,在stackoverflowfind答案。

 $ git rm --cached OtherLibrary/MKStore 

然后再次更新子模块。 这工作正常。

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

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

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

我的解决scheme是使用命令行来删除它。

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

在垃圾中清除垃圾并保持清洁。

我为我解决了这个问题。 最初我试图做到这一点:

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

事实certificate,如果要克隆主分支,则不应使用–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所需的行不会被添加。

所以我的解决scheme是这样的:

 git submodule add [URL] [PATH_TO_SUBMODULE] 

我尝试在我的回购的新签出“git子模块初始化”后,只是打这个错误。 原来,我最初指定了错误的情况下模块子文件夹。 由于我在Mac上使用区分大小写的文件系统(hurr),因此失败了。 例如:

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

成功但麻烦在于磁盘上的path是

 Myapp/Resources/Project 

我不明白的是,为什么git正在将模块启动到错误的文件夹(忽略命令中的错误情况),然后使用后续命令正确运行(通过失败)。

刚刚有这个问题。 有一段时间,我尝试了关于删除path的build议,git删除path,删除.gitmodules,从.git / config删除条目,添加子模块,然后提交并推送更改。 这是令人费解的,因为当我做了“git commit -a”的时候,它看起来没有任何变化,所以我试图推动删除,然后推动读取,使其看起来像一个变化。

过了一会儿,我意外地注意到,在删除所有内容之后,如果我运行“git submodule update –init”,它就会有一个关于git应该不再有任何引用的特定名称的消息:子模块的名称链接到,而不是它检查出来的path名称。 grepping显示这个引用是在.git / index中的。 所以我运行“git rm –cached repo-name”,然后读取模块。 当我这次提交时,提交消息包含一个正在删除这个意外对象的更改。 之后,它工作正常。

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

scheme:将子目录从目录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

    如果返回错误:在pathdirA-xxx的.gitmodules中找不到子模块映射。 这是由于dirA-xxx不存在,但它仍然被git跟踪。 更新git索引: git rm --cached dirA-xxx

    尝试用git submodule foreach git pull 。 我没有经过git submodule结构的实际研究,所以上面的步骤可能会破坏一些东西。 尽pipe如此,通过上述步骤,目前情况看起来不错。 如果您有任何见解或适当的步骤来完成任务,请在此分享。 🙂

可以在.git/modules文件夹中find文件夹映射(每个文件夹都具有参考其工作worktree config文件),因此请确保这些文件夹与.gitmodules.git/config的configuration相对应。

所以.gitmodules有正确的path:

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

并且在[core]部分的.git/modules/<path>/config中,您有正确的path到<path> ,例如

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

如果.git/modules的正确文件夹丢失,那么你必须去你的子模块目录,然后尝试git reset HEAD --hardgit checkout master -f 。 如果这样做不起作用,那么可能需要删除所有对已损坏的子模块的引用并重新添加,然后参阅: 重命名git子模块 。

只要git rm subdir就可以了。 这将删除作为索引的子目录。

在文件.gitmodules中 ,我replace了string

 "path = thirdsrc\boost" 

 "path = thirdsrc/boost", 

解决了! – –

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

当你在一个CMS上工作时,它可能会安装带有git元数据的特定模块/插件的.git /目录的modules / plugins

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

看了我的.gitsubmodules ,发现我确实有一个大写字母,我不应该有。 请记住, .gitsubmodules目录区分大小写

在我的情况下,错误可能是由于两个分支上具有不同子模块configuration的.gitmodules之间的错误合并。 从这个论坛的build议,我解决了手动编辑.gitmodules文件的问题,添加缺less的子模块条目是非常容易的。 之后,命令git子模块更新 – init –recursive没有问题。

我们面临的问题是重复的子模块条目已被添加到.gitmodules(可能来自合并)。 我们在gitmodules中search了git的path,发现了两个相同的部分。 删除其中一个部分解决了我们的问题。

为什么值得,git 1.7.1给了“没有子模块映射”的错误,但git 2.13.0似乎并不在意。