将公共代码添加为git子模块的问题:“已存在于索引中”

时间:2012-10-15 14:55:07

标签: git git-submodules

我是git的新手,非常感谢您添加子模块的帮助。 我收到了两个共享一些常用代码的项目。共享代码刚刚复制到两个项目中。我为公共代码创建了一个单独的git repo,并将其从计划中删除,并计划将其添加为git子模块。

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

git submodule add url_to_repo projectfolder

然后得到了错误:

'projectfolder' already exists in the index"

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

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

可以直接在repo中添加git子模块,也可以将其添加到新文件夹中,但不能添加到项目文件夹中。问题是它确实需要在项目文件夹中。 我能做些什么以及我对git submodule add的路径选项误解了什么?

11 个答案:

答案 0 :(得分:298)

我担心你的问题中没有足够的信息来确定发生了什么,因为你没有回答我的后续问题,但这在任何情况下都可能有所帮助。

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

git ls-files --stage projectfolder

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

我怀疑你会看到类似的东西:

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

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

git rm --cached projectfolder

......取消它,然后:

git submodule add url_to_repo projectfolder

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

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

projectfolder

...然后添加子模块:

git rm -r --cached projectfolder

答案 1 :(得分:36)

手动删除子模块涉及多个步骤,这对我有用。

假设您在项目根目录中并且示例git模块名称为" c3-pro-ios-framework"

删除与子模块关联的文件

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

删除对配置

中子模块的任何引用
vim .git/config

enter image description here

删除.gitmodules

rm -rf .gitmodules

在没有" git"

的情况下将其从缓存中删除
git rm --cached c3-pro-ios-framework

添加子模块

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

答案 2 :(得分:32)

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

我得到的错误有点不同:<path> already exists and is not a valid git repo(此处为SEO值添加)

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

此外,该参数预计与父 - repo根相关,而不是您的工作目录,因此请注意。

上述示例的解决方案:

  1. 可以将您的父级仓库克隆。
  2. 确保common_code目录存在。
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/请注意所需的尾随斜杠。
  5. 恢复了理智。
  6. 我希望这对某人有所帮助,因为其他地方的信息很少。

答案 3 :(得分:18)

首先需要删除git路径的子模块git存储库(在这种情况下为projectfolder)。

rm -rf projectfolder

git rm -r projectfolder

然后添加子模块

git submodule add <git_submodule_repository> projectfolder

答案 4 :(得分:14)

如果在git控件下存在名为x的文件夹,则需要添加同名子模块,您应该删除文件夹x并先提交

由@ ujjwal-singh更新:

不需要提交,暂存足够.. git add / git rm -r

答案 5 :(得分:2)

只是用人类语言澄清错误试图告诉你的内容:

您无法在此文件夹中创建已在主存储库中跟踪的存储库。

例如:您有一个名为AwesomeTheme的主题文件夹,它是一个专用存储库,您尝试将其直接转储到主存储库中,如git submodule add sites/themes,然后您将获得此"AwesomeTheme" index already exists

您只需要确保主存储库的版本跟踪中没有sites/themes/AwesomeTheme,以便可以在那里创建子模块。

所以要修复,如果你有一个空的sites/theme/AwesomeTheme目录,那么在你的主存储库中删除它。如果您已经使用主存储库中的sites/theme/AwesomeTheme目录进行了提交,则需要使用以下命令清除其所有历史记录:

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中看到任何内容(a.k.a index&#39; d),因此现在可以创建它。

答案 6 :(得分:1)

我通过相反的方式实现它。从空仓库开始,将子模块添加到名为“projectfolder / common_code”的新文件夹中。之后,可以在项目文件夹中添加项目代码。详情如下所示。

在空的回购类型中:

git submodule add url_to_repo projectfolder/common_code

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

repo
|-- projectfolder
    |-- common_code

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

我还不能说它为什么会这样,而不是另一种。

答案 7 :(得分:1)

如果目标路径中缺少.git文件,则会发生这种情况。我执行git clean -f -d后发生在我身上。

我必须删除消息中显示的所有目标文件夹,然后执行git submodule update --remote

答案 8 :(得分:0)

不知道这是否有用,虽然我在尝试从IntelliJ 15中提交文件时遇到了同样的问题。最后,我打开了SourceTree,在那里我可以简单地提交文件。问题解决了。无需发出任何花哨的git命令。如果有人有同样的问题,请提一下。

答案 9 :(得分:0)

转到存储库文件夹。从.gitmodules中删除相关的子模块。选择显示隐藏文件。转到.git文件夹,从模块文件夹和配置中删除子模块。

答案 10 :(得分:-13)

在您的git目录中,假设您已同步所有更改。

rm -rf .git 

rm -rf .gitmodules

然后做:

git init
git submodule add url_to_repo projectfolder