我有一个项目在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文件的一部分,所以我看不到它从何处获得此路径。

有什么想法吗?

评论

听起来您可能已经设法将该路径添加为gitlink-子模块是gitlink以及.gitmoddules和.git / config文件中条目的组合。最近有一个关于这个的问题。试图找到它...

@Jefromi:stackoverflow.com/questions/4161022/…?

@Jefromi-我在.git文件夹中的任何位置都找不到该路径。进行grep -r“ Classes / Support / Three20” *。*也不会产生任何结果

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

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

#1 楼

按照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的子模块。

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

评论


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

–aaronbauman
17 Mar 17 '17 at 14:33

在这里找到我的答案:stackoverflow.com/questions/14720034/…

–aaronbauman
17 Mar 17 '17 at 14:42

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

–VonC
17年3月17日在15:00

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

–约翰·麦克
17年9月9日13:57

@JohnMike,如果您有引用这些条目的.gitmodule,则请使用stackoverflow.com/a/16162000/6309。如果没有,一个简单的git rm文件夹(没有尾随/斜杠)

–VonC
17年11月9日在13:59

#2 楼

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


$ git submodule update --init


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

$ git rm --cached OtherLibrary/MKStore


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

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

评论


在编辑.gitmodules文件以通过git://链接更改https://链接后,它对我有用

– Diwann
13年6月18日在12:24

这对我也同样有效,但是我必须确保子模块路径的末尾没有斜杠。

–彼得
2014年3月27日在16:45

我不敢相信我忘记了init选项。如果克隆项目,则应先启动子模块,然后再更新它们。

– alex
15年4月20日在13:46

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

– Pwdr
2015年10月20日在20:13

非常感谢您的rm命令。我叫git submodule sync | grep“找到映射”,然后git rm和再次git子模块同步。问题消失了!

–nine9five
16-3-14在12:26



#3 楼

当我使用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中的垃圾并保持干净。

#4 楼

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

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]


#5 楼

我在尝试对我的仓库进行新的签出后尝试“ 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
15年5月6日在16:12

#6 楼

在.gitmodules文件中,我将字符串

"path = thirdsrc\boost" 

替换为

"path = thirdsrc/boost", 


,它解决了! --

评论


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

– Roozbeh G
16年1月31日在18:55

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

–碎片
18年11月14日在0:14

#7 楼

只需git rm subdir就可以了。将会删除子目录作为索引。

#8 楼

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

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

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

#9 楼

文件夹映射可以在.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子模块。

#10 楼

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


将dirA-xxx移至dirB-xxx
修改.gitmodules中的条目以使用dirB- xxx
修改.git / config中的条目以使用dirB-xxx
修改.git / modules / dirA-xxx / config来反映正确的目录
修改dirA-xxx / .git来反映正确的目录

运行git submodule status

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

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



#11 楼

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

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

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

#12 楼

在查看了我的.gitmodules之后,结果发现我确实有一个大写字母,而我不应该有。因此请记住,.gitmodules目录区分大小写

#13 楼

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

#14 楼

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

就其价值而言,git 1.7.1给出了“无子模块映射”错误,但git 2.13.0似乎不在乎。 br />

#15 楼

如果您具有:

使用简单的rm而不是git rm删除了子模块;
删除了.gitmodules中对该子模块的引用;
删除了.git/config中的对该子模块的引用;

您仍然遇到错误,为我解决的问题是读回一个空文件夹,该子文件夹曾经是该文件夹。您可以执行以下操作:
mkdir -p path/to/your/submodule
touch path/to/your/submodule/.keep

.keep只是一个空文件。 git commit它,错误应该消失。