我有一个项目在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
文件的一部分,所以我看不到它从哪里获得这条路径。
有什么想法吗?
答案 0 :(得分:371)
在.gitmodules中找不到路径'OtherLibrary / MKStore'的子模块映射 当
$ git submodule update --init
我不知道错误发生的原因。花了一分钟后,在stackoverflow中找到答案。
$ git rm --cached OtherLibrary/MKStore
然后再次更新子模块。它工作正常。
http://en.saturngod.net/no-submodule-mapping-found-in-gitmodules
答案 1 :(得分:278)
关注rajibchowdhury的answer(已投票),使用git rm
命令,建议删除special entry in the index indicating a submodule(a'文件夹'使用特殊模式160000
)。
如果.gitmodule
中未引用该特殊条目路径(如原始问题中的“Classes/Support/Three20
”),则需要按顺序将其删除避免“在.gitmodules
中找不到路径的子模块映射”错误消息。
您可以检查索引中引用子模块的所有条目:
git ls-files --stage | grep 160000
上一个答案(2010年11月)
有可能你没有正确地声明你的初始子模块(即my old answer中描述的最后没有任何尾部'/',即使你的.gitmodule
有看似正常的路径在它)。
This thread提及:
从新克隆运行'git submodule init'时会出现同样的错误吗? 如果是这样,你就有问题了。
如果没有子模块,请删除
.gitmodules
以及对子模块的任何引用 .git / config,并确保Pikimal目录中没有.git
目录 如果这样可以解决问题,请检查并在巡航工作副本上执行相同操作。
显然,不要删除主.gitmodules
文件,而是在工作树中查看其他额外的.gitmodules
文件。
仍然在“不正确的子模块初始化”主题中,Jefromi提到了实际上是gitlinks的子模块。
请参阅How to track untracked content?以将此类目录转换为真实的子模块。
答案 2 :(得分:20)
当我使用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中的垃圾并保持清洁。
答案 3 :(得分:15)
我为我解决了这个问题。最初我尝试这样做:
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]
答案 4 :(得分:8)
我在我的repo的新结帐时尝试“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会将模块初始化为错误的文件夹(忽略我的命令中的错误情况),然后使用后续命令正确操作(失败)。
答案 5 :(得分:5)
刚出现这个问题。有一段时间我尝试了关于删除路径的建议,git删除路径,删除.gitmodules,从.git / config中删除条目,添加子模块,然后提交并推送更改。令人费解的是因为当我执行“git commit -a”时看起来没什么变化所以我试图推动删除,然后推动读取使其看起来像一个变化。
过了一会儿,我意外地注意到在删除所有内容之后,如果我运行了“git submodule update --init”,它就会有一条关于git应该不再具有任何引用的特定名称的消息:子模块链接到的存储库,而不是它检查的路径名。 Grepping显示此引用位于.git / index中。所以我运行了“git rm --cached repo-name”,然后读取了模块。当我这次提交时,提交消息包含一个更改,它正在删除此意外对象。之后它运作正常。
不确定发生了什么,我猜是有人误用了git submodule命令,可能会反转参数。甚至可能是我...希望这有助于某人!
答案 6 :(得分:5)
只需git rm subdir
即可。这会将subdir删除为索引。
答案 7 :(得分: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 --hard
或git checkout master -f
。如果这不会有帮助,您可能希望删除对已损坏子模块的所有引用并再次添加,然后查看:Rename a git submodule。
答案 8 :(得分:3)
场景:将子模块从目录dirA-xxx更改为另一个目录dirB-xxx
运行git submodule status
如果返回错误:在.gitmodules中找不到路径dirA-xxx的子模块映射。这是由于dirA-xxx不存在,但它仍然由git跟踪。通过以下方式更新git索引:git rm --cached dirA-xxx
尝试使用git submodule foreach git pull
。
我没有经过git子模块结构的实际研究,所以上面的步骤可能会破坏一些东西。尽管如此,经历了上述步骤,目前看起来还不错。如果您有任何见解或适当的步骤来完成任务,请在此处分享。 :)
答案 9 :(得分:3)
在文件 .gitmodules 中,我替换了字符串
"path = thirdsrc\boost"
带
"path = thirdsrc/boost",
它解决了! - -
答案 10 :(得分:1)
通常,git在项目的根目录(.git /)中创建一个隐藏目录
当您在CMS上工作时,您可以安装带有.git /目录的模块/插件,其中包含特定模块/插件的git元数据
最快的解决方案是查找所有.git目录并仅保留根git元数据目录。如果这样做,git不会将这些模块视为项目子模块。
答案 11 :(得分:1)
在查看我的.gitmodules
之后,结果发现我确实有一个大写字母,我不应该这样。请注意,.gitmodules
目录区分大小写
答案 12 :(得分:0)
在我的情况下,错误可能是由于两个具有不同子模块配置的分支上的.gitmodules之间的不正确合并。 在从这个论坛获取建议后,我解决了手动编辑.gitmodules文件的问题,添加缺少的子模块条目非常简单。之后,命令 git submodule update --init --recursive 没有任何问题。
答案 13 :(得分:0)
我们遇到的问题是重复的子模块条目已被添加到.gitmodules中(可能来自合并)。我们在.gitmodules中搜索了git抱怨的路径,并找到了两个相同的部分。删除其中一个部分为我们解决了问题。
对于它的价值,git 1.7.1给出了“无子模块映射”错误,但是git 2.13.0似乎并不关心。
答案 14 :(得分:0)
如果有:
rm
而非git rm
删除了子模块; .gitmodules
中删除了对该子模块的引用; .git/config
中的引用; 您仍然遇到错误,为我解决的问题是读回一个空文件夹,该子模块曾经是该文件夹。您可以执行以下操作:
mkdir -p path/to/your/submodule
touch path/to/your/submodule/.keep
.keep
只是一个空文件。 git commit
,错误应该消失。