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

412

我有一个项目,在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文件条目的组合。最近有一个关于此问题的提问; 正在尝试找到它... - Cascabel
11
@Jefromi:https://dev59.com/questions/G2855IYBdhLWcg3ww3Sa#4162672? - VonC
2
@Ben:你为什么要在.git文件夹中搜索那个text?这不是git存储内容的方式。如果你真的想验证git认为它是什么,请尝试git ls-tree HEAD Classes/Support,如果它说Three20是一个提交,则有一个gitlink。如果有,请按照VonC上面链接的问题的适当说明将其转换为正确的子模块或将其转换为常规跟踪内容。 - Cascabel
3
如果您的问题与已删除的子模块和Heroku抛出的错误有关,请从https://github.com/heroku/heroku-repo安装heroku-repo,并运行heroku repo:reset -a appname。 - fadomire
1
@ipatch 很好的观点。我已经在我的回答中引用了你的笔记,以增加可见性。 - VonC
显示剩余5条评论
19个回答

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

    如果返回错误:No submodule mapping found in .gitmodules for path dirA-xxx。这是因为 dirA-xxx 不存在,但仍然被 git 跟踪。通过以下方式更新 git 索引:git rm --cached dirA-xxx

    尝试使用 git submodule foreach git pull

    我没有实际研究过 git 子模块结构,因此上述步骤可能会破坏某些内容。尽管如此,经过上述步骤,目前看起来一切都很好。如果您有任何见解或适当的步骤来完成任务,请在这里分享。:)


2
如果您出现以下情况:
  • 使用rm 而不是 git rm 删除了子模块;
  • 删除了 .gitmodules 中的子模块引用;
  • 删除了.git/config中的引用;
如果你仍然遇到错误,可以通过重新添加空文件夹来解决。您可以使用以下命令实现:
mkdir -p path/to/your/submodule
touch path/to/your/submodule/.keep

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


1
通常情况下,git会在项目根目录创建一个隐藏的目录(.git/)。
当你在使用CMS时,可能会安装包含特定模块/插件的.git/目录和git元数据。
最快的解决方案是找到所有的.git目录,只保留根git元数据目录。如果这样做,git将不会将这些模块视为项目子模块。

1
在查看了我的.gitmodules文件后,发现我在不应该的地方使用了大写字母。因此请记住,.gitmodules目录是区分大小写的

1

致命错误:在子模块路径“path/to/submodule”中找不到url 在.gitmodules中没有找到“path/to/submodule”的子模块映射

当我从我的根目录文件夹cd到./resources/css/style.css时,这些错误开始出现。

我在style.css中使用了git init,在添加git add remote origin <url>之后意识到了我的错误。

所以,在git bash的style.css文件中,我使用了git remove remote origin

当我检查git remote时,远程链接已被删除。

最终,在对根目录进行git init并将其添加到远程之后,资源/ css路径提供了上面列出的子模块错误/致命错误。因此,从根目录,在git bash中,我键入了git rm --cached resources/css,删除了css目录(保存了代码),推送了更改,并在不同的分支中添加了css目录和styles.css文件(可选),以查看再次推送更改并检查github页面上的部署结果。它起作用了!我知道删除目录并不总是理想的,特别是在大型项目中,但只是想分享另一种解决此问题的方法!

P.S对stackoverflow相当新,因此对冗长的文本表示歉意。 #2022答案


2
嗨@Malik。看起来你的答案与现有的答案相似。如果你认为你的答案不同,也许你可以尝试改进它并阐明差异。 - rjmAmaro

1
我解决了删除仓库并运行该命令的问题。
git clone --recurse-submodules https://github.com/chaconinc/MainProject

在那之后,对我来说运行良好,因为这里的选项都没有帮助。

它所做的是:

  1. 克隆主存储库
  2. 在完成克隆后立即初始化子模块

就是这样

您可以在下面的链接中找到更多信息

子模块


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

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

0
对我们来说,问题在于 .gitmodules 中添加了重复的子模块条目(可能是由于合并操作)。我们在 .gitmodules 中搜索 git 抱怨的路径,并找到了两个相同的部分。删除其中一个部分解决了我们的问题。
值得一提的是,git 1.7.1 给出了“没有子模块映射”的错误,但 git 2.13.0 似乎并不关心这个问题。

0
在我的情况下,我将.gitmodules文件移动到根目录解决了问题,花了我半个小时才弄清楚...
Root
 Dir
 Dir
 Dir
  Dir
   Submodule repo files
   .gitmodules [Wrong place]

Root
 Dir
 Dir
 Dir
  Dir
   Submodule repo files
.gitmodules [Correct]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接