Git索引挂在旧子模块路径上?

时间:2016-07-31 18:14:49

标签: git git-submodules

我有一个包含两个子模块的存储库。当我运行git submodule initgit 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吗?如何清理它以便我可以正常初始化和构建我的仓库?

1 个答案:

答案 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)让我怀疑这一点,但是我的博客帖子让我明白了如何打开索引。