.gitmodule中没有为非子模块的路径找到子模块映射

时间:2010-11-15 14:38:56

标签: git git-submodules

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

有什么想法吗?

15 个答案:

答案 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)

关注rajibchowdhuryanswer(已投票),使用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 --hardgit checkout master -f。如果这不会有帮助,您可能希望删除对已损坏子模块的所有引用并再次添加,然后查看:Rename a git submodule

答案 8 :(得分: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子模块结构的实际研究,所以上面的步骤可能会破坏一些东西。尽管如此,经历了上述步骤,目前看起来还不错。如果您有任何见解或适当的步骤来完成任务,请在此处分享。 :)

答案 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,错误应该消失。