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

Van*_*nja 199 git git-submodules

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

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

git submodule add url_to_repo projectfolder
Run Code Online (Sandbox Code Playgroud)

但后来得到了错误:

'projectfolder' already exists in the index"
Run Code Online (Sandbox Code Playgroud)

这是我的存储库的理想结构:

repo
|-- projectfolder
    |-- folder with common code
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*air 318

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

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

git ls-files --stage projectfolder
Run Code Online (Sandbox Code Playgroud)

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

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

160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder
Run Code Online (Sandbox Code Playgroud)

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

git rm --cached projectfolder
Run Code Online (Sandbox Code Playgroud)

...取消它,然后:

git submodule add url_to_repo projectfolder
Run Code Online (Sandbox Code Playgroud)

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

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

git rm -r --cached projectfolder
Run Code Online (Sandbox Code Playgroud)

...然后添加子模块:

git submodule add url_to_repo projectfolder
Run Code Online (Sandbox Code Playgroud)

  • 感谢Mark提供的详细解答.我做了一个"git rm -r --cached projectfolder"并尝试再次使用子模块.但是这次我得到错误rmessage"'projectfolder'已经存在并且不是有效的git repo". (11认同)
  • @Vanja:这表明`projectfolder`没有包含`.git`目录.这听起来好像你在其他地方为`projectfolder`创建了新的存储库,并将其复制到位,但显然并非如此.您需要将现有的`projectfolder`移开,然后将新存储库(包含其`.git`目录)复制到位,然后再添加为子模块.或者,如果您已将其推送到由`url_to_repo`表示的存储库,则可以将`projectfolder`移开,然后从该URL添加子模块. (3认同)

Gaj*_*ara 45

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

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

删除与子模块关联的文件

rm -rf .git/modules/c3-pro-ios-framework/
Run Code Online (Sandbox Code Playgroud)

删除config中对子模块的任何引用

vim .git/config
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

删除.gitmodules

rm -rf .gitmodules
Run Code Online (Sandbox Code Playgroud)

没有"git"从缓存中删除它

git rm --cached c3-pro-ios-framework
Run Code Online (Sandbox Code Playgroud)

添加子模块

git submodule add https://github.com/chb/c3-pro-ios-framework.git
Run Code Online (Sandbox Code Playgroud)

  • 伟大的帖子,效果很好.先生,大家好好分享一下.非常好. (2认同)

She*_*ton 33

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

我得到的错误有点不同:( <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. 恢复了理智.

我希望这对某人有所帮助,因为其他地方的信息很少.

  • 第 4 步应该以 `git submodule add` 开始,并且不需要尾部斜杠。 (2认同)

Nee*_*mar 26

您需要首先删除您的子模块git存储库(在本例中为projectfolder)以获取git路径.

rm -rf projectfolder

git rm -r projectfolder
Run Code Online (Sandbox Code Playgroud)

然后添加子模块

git submodule add <git_submodule_repository> projectfolder
Run Code Online (Sandbox Code Playgroud)

  • `git submodule add --force &lt;git_submodule_repository&gt;` 帮助我保持相同的子模块名称 (13认同)

jus*_*ilt 15

如果存在一个名为xgit control 的文件夹,你想要添加一个同名的子模块,你应该删除文件夹x并先提交它.

由@ ujjwal-singh更新:

不需要提交,分段就足够了.. git add/git rm -r

  • 不需要提交,分段就足够了.`git add` /`gir rm -r` (2认同)

Dyl*_*rce 5

只是为了用人类语言澄清错误试图告诉你什么:

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

例如:您有一个名为的主题文件夹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
Run Code Online (Sandbox Code Playgroud)

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

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