我有一个项目,在lib/three20有一个子模块

我的.gitmodule文件是这样的:

[submodule "lib/three20"]
    path = lib/three20
    url = git://github.com/facebook/three20.git

我克隆了这个在过去没有错误,(git子模块init紧随git子模块更新),它已经工作了一段时间。

我试图克隆这个到一个新的机器,现在我在git子模块init上得到这个错误:

No submodule mapping found in .gitmodules for path 'Classes/Support/Three20'

这个路径只是Xcode中的一个空文件夹,我用它来存放来自另一个目录的项目。它不是.gitmodules文件的一部分,所以我不知道它从哪里得到这个路径。

什么好主意吗?


当前回答

文件夹映射可以在.git/modules文件夹中找到(每个文件夹都有参考其工作树的配置文件),因此确保这些文件夹对应于.gitmodules和.git/config中的配置。

因此.gitmodules有正确的路径:

[submodule "<path>"]
  path = <path>
  url = git@github.com:foo/bar.git

在[core]部分的.git/modules/<path>/config中,你有你的<path>的正确路径,例如。

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  worktree = ../../../<path>

如果在.git/modules中没有正确的文件夹,那么你必须去你的子模块目录并尝试git reset HEAD——hard或git checkout master -f。如果这没有帮助,你可能想删除所有对损坏子模块的引用,然后重新添加它,然后参见:重命名git子模块。

其他回答

通常,git会在项目的根目录(.git/)中创建一个隐藏目录。

当你在CMS上工作时,你可能会安装带有.git/目录的模块/插件,其中包含特定模块/插件的git元数据

最快的解决方案是找到所有的.git目录,只保留根git元数据目录。如果这样做,git将不会将这些模块视为项目子模块。

我刚刚在尝试“git子模块初始化”后遇到了这个错误,在我的回购的新签出。原来我最初用错误的大小写指定了模块子文件夹。因为我用的是区分大小写的Mac文件系统(hurr),所以它失败了。例如:

git submodule add git@github.com:user/project.git MyApp/Resources/Project
Cloning into 'MyApp/Resources/Project'

成功,但问题是在磁盘上的路径是

Myapp/Resources/Project

我不明白的是,为什么git将模块初始化到错误的文件夹(忽略我命令中的不正确情况),但随后使用后续命令正确操作(失败)。

文件夹映射可以在.git/modules文件夹中找到(每个文件夹都有参考其工作树的配置文件),因此确保这些文件夹对应于.gitmodules和.git/config中的配置。

因此.gitmodules有正确的路径:

[submodule "<path>"]
  path = <path>
  url = git@github.com:foo/bar.git

在[core]部分的.git/modules/<path>/config中,你有你的<path>的正确路径,例如。

[core]
  repositoryformatversion = 0
  filemode = true
  bare = false
  logallrefupdates = true
  worktree = ../../../<path>

如果在.git/modules中没有正确的文件夹,那么你必须去你的子模块目录并尝试git reset HEAD——hard或git checkout master -f。如果这没有帮助,你可能想删除所有对损坏子模块的引用,然后重新添加它,然后参见:重命名git子模块。

文件夹结构

xyz folder as root directory which contains 2 folder as submodule
  -- product
  -- user

从根目录执行以下命令

git rm --cached product/
git rm --cached user/

进入产品目录并执行

 git submodule update --init

进入用户目录并执行

git submodule update --init

再次进入根目录CD ..

git add --all

如果你有:

删除子模块使用简单的rm代替git rm; 在.gitmodules中删除了对子模块的引用; 删除了.git/config中的引用;

你还是会得到错误,解决这个问题的方法是读回子模块原来所在的空文件夹。你可以这样做:

mkdir -p path/to/your/submodule
touch path/to/your/submodule/.keep

.keep只是一个空文件。Git提交后错误就会消失。