添加通用代码作为git子模块的问题:“已经存在于索引中”

我是新来的混帐,并会感谢帮助添加子模块。 我收到了两个共享一些通用代码的项目。 共享代码只是复制到两个项目中。 我为通用代码创build了一个单独的git仓库,并将其从项目中删除,并将其添加为git子模块。

我用git submodule add的path选项来指定文件夹:

git submodule add url_to_repo projectfolder 

但后来得到了错误:

 'projectfolder' already exists in the index" 

这是我的存储库所需的结构:

 repo |-- projectfolder |-- folder with common code 

可以将git子模块直接添加到回购站中,或者直接添加到新文件夹中,但不能添加到项目文件夹中。 问题是,它真的需要在项目文件夹..我能做些什么,我有什么误解了git子模块的path选项添加?

恐怕没有足够的信息来确定发生了什么事情,因为你没有回答我的后续问题,但这可能对你有帮助。

该错误意味着项目文件projectfolder已经上演(“已经存在于索引中”)。 要了解这里发生了什么,请尝试列出该文件夹下索引中的所有内容:

 git ls-files --stage projectfolder 

该输出的第一列将告诉你在projectfolder的索引中有什么types的对象。 (这些看起来像Unix文件模式,但在git中有特殊的含义。)

我怀疑你会看到像这样的东西:

 160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0 projectfolder 

(即以160000开始的行),在这种情况下, projectfolder的存储库已经添加为“gitlink”。 如果它没有出现在git submodule的输出中,并且你想重新添加它作为子模块,你可以这样做:

 git rm --cached projectfolder 

把它卸下来,然后:

 git submodule add url_to_repo projectfolder 

…将存储库作为子模块添加

但是,也可能会看到许多列出的斑点(文件模式为100644100755 ),这会向我build议,在将新的存储库复制projectfolder之前,没有正确projectfolder文件projectfolder的文件。 如果是这种情况,您可以执行以下操作来取消所有这些文件:

 git rm -r --cached projectfolder 

…然后添加子模块:

 git submodule add url_to_repo projectfolder 

我有同样的问题,并在几个小时后find答案。

我得到的错误是有点不同: <path> already exists and is not a valid git repo (在这里增加了SEO值)

解决scheme是不创build将容纳子模块的目录。 该目录将作为git submodule add命令的一部分被创build。

另外,这个参数预计是相对于父回购的根,而不是你的工作目录,所以要小心。

上面的例子的解决scheme:

  1. 你父母的回购已经克隆好了。
  2. 确保common_code目录不存在。
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/注意所需的尾部斜线。
  5. 理智恢复。

我希望这有助于某人,因为在其他地方找不到有关这方面的信息。

手动删除子模块涉及到一些步骤,这对我有效。

假设你在项目根目录下,并且示例git模块名称是“c3-pro-ios-framework”

删除与子模块关联的文件

 rm -rf .git/modules/c3-pro-ios-framework/ 

删除对config中子模块的引用

 vim .git/config 

在这里输入图像说明

删除.gitmodules

 rm -rf .gitmodules 

从caching中删除它没有“混帐”

 git rm --cached c3-pro-ios-framework 

添加子模块

 git submodule add https://github.com/chb/c3-pro-ios-framework.git 

如果在git控制下有一个名为x的文件夹,你想要添加一个同名的子模块,你应该先删除文件夹x并提交它

@ ujjwal-singh更新:

提交是不需要的,分期足够.. git add / gir rm -r

我是这样做的。 从一个空的回购开始,将子模块添加到名为“projectfolder / common_code”的新文件夹中。 之后,可以在项目文件夹中添加项目代码。 细节如下所示。

在一个空的回购types中:

 git submodule add url_to_repo projectfolder/common_code 

这将创build所需的文件夹结构:

 repo |-- projectfolder |-- common_code 

现在可以添加更多的子模块,项目代码可以添加到项目文件夹中。

我不能说为什么它这样做,而不是其他。

只是为了澄清在人类的语言错误是想告诉你:

您不能在已经在主资源库中跟踪的文件夹中创build资源库。

例如:你有一个名为AwesomeTheme的主题文件夹,它是一个专用的存储库,你可以直接把它转储到你的主存储库,比如git submodule add sites/themes ,你会得到这个"AwesomeTheme" index already exists

你只需要确定在主版本库的版本跟踪中还没有sites/themes/AwesomeTheme ,这样子模块就可以在那里创build了。

所以要解决,如果你有一个空的sites/theme/AwesomeTheme目录,然后将其删除,在您的主要存储库。 如果您已经在主仓库中提交了sites/theme/AwesomeTheme目录,则需要使用如下命令清除其所有历史logging:

 git filter-branch --index-filter \ 'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme' HEAD 

现在你可以运行git submodule add git@AwesomeTheme.repowhateverurlthing sites/themes/AwesomeTheme

由于主存储库从未在sites/themes/AwesomeTheme看到过任何东西(又名索引),现在可以创build它了。

不知道这是否有用,尽pipe当我尝试从IntelliJ 15中提交文件时遇到了同样的问题。最后,我打开了SourceTree,在那里我可以简单地提交该文件。 问题解决了。 不需要发出任何奇特的git命令。 只要提到它,以防万一任何人有同样的问题。

在你的git目录中,假设你已经同步所有的改变。

 rm -rf .git rm -rf .gitmodules 

然后做:

 git init git submodule add url_to_repo projectfolder