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

Posted

技术标签:

【中文标题】将公共代码添加为 git 子模块的问题:“索引中已存在”【英文标题】:Issue with adding common code as git submodule: "already exists in the index" 【发布时间】:2012-10-05 14:00:26 【问题描述】:

我是 git 新手,希望能在添加子模块方面提供帮助。 我收到了两个共享一些通用代码的项目。共享代码刚刚复制到两个项目中。我为公共代码创建了一个单独的 git 存储库,并将其从项目中删除,并计划将其添加为 git 子模块。

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

git submodule add url_to_repo projectfolder

但随后出现错误:

'projectfolder' already exists in the index"

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

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

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

【问题讨论】:

如果你这样做git ls-files --stage projectfolder会得到什么? 我得到一个列表,所有内容都以 100644 开头。 相关:***.com/questions/12696919/… 对我来说在现有文件夹上做一个git rm 有帮助:| 【参考方案1】:

恐怕您的问题中没有足够的信息来确定发生了什么,因为您还没有回答我的后续问题,但这无论如何可能会有所帮助。 em>

该错误意味着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),这表明您在复制新文件之前没有正确取消暂存 projectfolder 中的文件存储库到位。如果是这种情况,您可以执行以下操作来取消暂存所有这些文件:

git rm -r --cached projectfolder

... 然后添加子模块:

git submodule add url_to_repo projectfolder

【讨论】:

感谢马克的详细回答。我做了一个“git rm -r --cached projectfolder”并尝试再次访问子模块。但是这次我收到错误消息“'projectfolder'已经存在并且不是有效的git repo”。 @Vanja:这表明projectfolder 不包含.git 目录。从您的问题听起来好像您在其他地方为projectfolder 创建了新存储库,并将其复制到位,但显然情况并非如此。您需要将现有的projectfolder 移开,然后将新存储库(连同其.git 目录)复制到位,然后再添加为子模块。或者,如果您已经将其推送到由 url_to_repo 表示的存储库,您可以将 projectfolder 移开,然后从该 URL 添加子模块。 这对我帮助很大。谢谢! 这就是我所做的,这是 3 步过程第 1 步: git rm -r --cached src/test/resources/ ,第 2 步:将现有资源目录删除到其他地方,第 3 步: git submodule add add url_to_repo src/test/resources 谢谢,当我试图匆忙添加另一个 repo 并且以错误的方式(在 repo 中克隆,而不是 git submodule add)时,这帮助了我。在我的另一台机器上,它似乎是一个子模块,但从未创建过 .gitmodules 文件。上述步骤使我走上了解决问题的道路。非常感谢!【参考方案2】:

您需要首先删除您的子模块 git 存储库(在本例中为项目文件夹)以获取 git 路径。

rm -rf projectfolder

git rm -r projectfolder

然后添加子模块

git submodule add <git_submodule_repository> projectfolder

【讨论】:

git submodule add --force &lt;git_submodule_repository&gt; 帮助我保持相同的子模块名称 谢谢!!我不必在项目文件夹中添加,我只是更改到子目录并从那里克隆。 你是个天才!【参考方案3】:

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

假设您在项目根目录中,示例 git 模块名称为“c3-pro-ios-framework”

删除与子模块关联的文件

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

删除配置中对子模块的所有引用

vim .git/config

删除 .gitmodules

rm -rf .gitmodules

不带“git”从缓存中删除

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

添加子模块

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

【讨论】:

很棒的帖子,效果很好。很高兴分享它,先生。真的很棒。 我试图在删除之后和添加之前通过git submodule 列出子模块,它给了我一个错误,提交删除处理了它。 如果可以的话,我会投票给这 50 倍;你刚刚拯救了我的一天! touch .gitmodules (需要在工作树中,因此删除它会有所帮助。但您需要再次添加它)。很棒的帖子顺便说一句。唯一在这里起作用的东西。 .git 目录对我来说还有剩余。这很好用。谢谢。【参考方案4】:

我遇到了同样的问题,经过数小时的寻找找到了答案。

我得到的错误有点不同:&lt;path&gt; already exists and is not a valid git repo(并在此处添加以获取 SEO 价值)

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

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

上例的解决方案:

    可以克隆您的父存储库。 确保common_code 目录存在。 cd Repo git submodule add git://url_to_repo projectfolder/common_code/注意必需的斜杠。) 恢复理智。

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

【讨论】:

第 4 步应以 git submodule add 开头,并且不需要尾部斜杠。 修正了错字。我重新测试了它,尾部的斜线对我产生了影响。如果有任何效果,我正在使用 zsh。 这解决了我的问题(使用添加子模块命令创建目录),谢谢! 非常感谢,这是我的问题......所以从模块内部到包含斜杠的文件夹的相对路径!这解决了它,谢谢。所以对我来说,gitbash 的命令看起来像这样:git submodule add -b master "git@bitbucket.org:remote_repo.git" "mytools/src/project/grpc/protos/" 【参考方案5】:

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

由@ujjwal-singh 更新:

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

【讨论】:

提交是我错过的。简短的答案,但正确的答案! 不需要提交,分期就够了..git add / gir rm -r【参考方案6】:

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

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

例如:您有一个名为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 中看到任何内容(也称为索引),因此它现在可以创建它。

【讨论】:

【参考方案7】:

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

在一个空的 repo 类型中:

git submodule add url_to_repo projectfolder/common_code

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

repo
|-- projectfolder
    |-- common_code

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

我还不能说为什么它会以这种方式工作而不是其他方式。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

小心git clean -f -d!确保首先备份所有文件!!!【参考方案10】:

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

【讨论】:

【参考方案11】:

如果您使用的是 Ubuntu,请记住也要从垃圾箱中删除文件。

在我的情况下,我将文件移到了垃圾箱。

【讨论】:

【参考方案12】:

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

rm -rf .git 

rm -rf .gitmodules

然后做:

git init
git submodule add url_to_repo projectfolder

【讨论】:

这将删除项目的整个历史记录!

以上是关于将公共代码添加为 git 子模块的问题:“索引中已存在”的主要内容,如果未能解决你的问题,请参考以下文章

Git 子模块:git submodule

git submodule update --init --recursive

git submodule update --init --recursive

git submodule update --init --recursive

Xcode Bots 不会将 git 子模块更新为指定的提交

git submodule 怎么用