我想添加一些git子模块。 我已经收到了两个共享一些公共代码的项目。共享代码只是复制到两个项目中。我为公共代码创建了一个单独的git repo,并将其从项目中删除,计划将其作为git子模块添加。

我使用了git子模块add的路径选项来指定文件夹:

git submodule add url_to_repo projectfolder

但随后出现了错误:

'projectfolder' already exists in the index"

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

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

可以直接在repo中添加git子模块,或者添加到那里的新文件夹中,但不能添加到项目文件夹中。问题是,它真的需要在项目文件夹.. 对此我能做什么,我对git子模块add的路径选项有什么误解?


当前回答

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

由@ujjwal-singh更新:

提交是不需要的,分期就足够了。Git add / Git rm -r

其他回答

由于你没有回复我的后续问题,恐怕你的问题中没有足够的信息来确定发生了什么,但这可能会有所帮助。

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

git ls-files --stage projectfolder

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

我猜你会看到这样的东西:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

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

git rm --cached projectfolder

... 取消它,然后:

git submodule add url_to_repo projectfolder

... 将存储库作为子模块添加。

但是,也有可能您会看到列出了许多blob(文件模式为100644和100755),这表明您在将新的存储库复制到适当的位置之前没有正确地取消projectfolder中的文件。如果是这种情况,你可以执行以下操作取消所有这些文件:

git rm -r --cached projectfolder

... 然后添加子模块:

git submodule add url_to_repo projectfolder

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

由@ujjwal-singh更新:

提交是不需要的,分期就足够了。Git add / Git rm -r

你需要首先删除你的子模块git存储库(在本例中是projectfolder)。

rm -rf projectfolder

git rm -r projectfolder

然后添加子模块

git submodule add <git_submodule_repository> projectfolder

不知道这是否有用,尽管我在试图从IntelliJ 15中提交文件时遇到了同样的问题。最后,我打开SourceTree,在那里我可以简单地提交文件。问题解决了。不需要发出任何花哨的git命令。只是顺便提一下,以防有人有同样的问题。

我也有同样的问题,经过几个小时的寻找,我找到了答案。

我得到的错误是有点不同:<path>已经存在,不是一个有效的git回购(并添加到这里的SEO值)

解决方案是不创建存放子模块的目录。该目录将作为git子模块add命令的一部分创建。

此外,参数应该相对于父-repo根目录,而不是您的工作目录,所以要注意这一点。

上述例子的解决方案:

这是可以让你的父回购已经克隆。 确保common_code目录不存在。 cd回购 git子模块添加git://url_to_repo projectfolder/common_code/(注意后面需要斜杠) 理智恢复。

我希望这能帮助到一些人,因为在其他地方找到的信息很少。