我有一个包含两个子模块的存储库。当我运行git submodule init
或git submodule update
时,Git抱怨,并出现以下错误:
致命:在.gitmodules中找不到路径' AppName.xcodeproj /的子模块映射。供应商/ AFNetworking'
我的子模块并不都在同一个目录中,我决定清理该项目。我曾经有一个名为Vendor
的目录,其中包含我的一些子模块,但是我按照here的指示从git中删除了子模块。然后,我在名为submodules
的新目录中重新添加了子模块。
我的一个子模块是AFNetworking
库,我在初始Vendor目录中添加了一个子模块。我不久前删除了它并重新添加它作为清理过程的一部分。该应用程序似乎构建得很好,我的git submodule
命令工作正常。现在,当我在另一台机器上结账时,它会失败,如上所述。
我的.gitmodules
文件如下所示:
[submodule "submodules/AFNetworking"]
path = submodules/AFNetworking
url = https://github.com/AFNetworking/AFNetworking.git
[submodule "submodules/LNPopupController"]
path = submodules/LNPopupController
url = https://github.com/MosheBerman/LNPopupController.git
这看起来很正常,因为git知道我的模块在哪里,一切都应该很好。我的.git/config
文件也是如此:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:MosheBerman/theshmuz.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[submodule "submodules/AFNetworking"]
url = https://github.com/AFNetworking/AFNetworking.git
错误是微妙的,我花了一段时间才意识到它,但我注意到错误消息引用了旧 Vendor
目录,该目录已不复存在。
我通过将cat的输出指向文本文件并使用文本编辑器来打开./git/index
。果然,AppName.xcodeproj/../Vendor/AFNetworking/
出现在索引中。这可能是一个糟糕的gitlink吗?如何清理它以便我可以正常初始化和构建我的仓库?
答案 0 :(得分:1)
之前我尝试从包含AppName.xcodeproj
的根目录中删除索引中的缓存引用,如下所示:
git rm --cached / Vendor / AFNetworking
所以,我重新创建了文件夹层次结构,我尝试在/Vendor/AFNetworking.
中添加一个虚拟文件。我还尝试添加一个名为&#34的文件; AFNetworking"在Vendor
内。添加然后删除这些文件并没有成功。
我再看一下这个问题,发现a blog post (link)解释了检查索引的正确方法。事实证明,我的索引对其中的旧子模块有一个奇怪的引用:
AppName.xcodeproj/../Vendor/AFNetworking.
解决方案是从索引中删除包含精确列表的文件,如下所示:
git rm --cached AppName.xcodeproj /../供应商/ AFNetworking
然后我就能成功运行git submodule update
。看起来索引并不总是与unix文件系统相对路径匹配,但在某些情况下它可能更具体。 Pro Git的书中有一些信息(在第9章版本中,Chapter 10 online)让我怀疑这一点,但是我的博客帖子让我明白了如何打开索引。