281

我是 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 的路径选项有什么误解?

4

12 回答 12

422

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

该错误意味着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
于 2012-10-15T19:43:00.207 回答
92

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

rm -rf projectfolder

git rm -r projectfolder

然后添加子模块

git submodule add <git_submodule_repository> projectfolder
于 2018-07-07T16:04:28.413 回答
66

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

假设您在项目根目录中并且示例 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
于 2016-06-13T17:34:45.183 回答
34

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

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

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

此外,该参数预计与父回购根目录相关,而不是您的工作目录,因此请注意这一点。

上例的解决方案:

  1. 可以克隆您的父仓库。
  2. 确保该common_code目录不存在
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/请注意所需的尾部斜杠。
  5. 理智恢复了。

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

于 2013-02-11T16:04:35.603 回答
20

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

由@ujjwal-singh 更新:

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

于 2017-02-14T07:30:39.277 回答
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

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

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

于 2016-07-25T15:02:25.867 回答
1

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

在一个空的 repo 类型中:

git submodule add url_to_repo projectfolder/common_code

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

repo
|-- projectfolder
    |-- common_code

现在可以添加更多子模块,并且可以将项目代码添加到 projectfolder。

我还不能说为什么它是这样工作的,而不是另一个。

于 2012-10-16T09:18:55.767 回答
1

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

于 2019-06-03T11:12:15.870 回答
1

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

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

于 2020-06-04T15:11:57.780 回答
0

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

于 2016-10-12T09:53:10.623 回答
0

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

在我的案例中,我将文件移至垃圾箱。

于 2021-11-01T16:59:12.197 回答
-26

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

rm -rf .git 

rm -rf .gitmodules

然后做:

git init
git submodule add url_to_repo projectfolder
于 2016-12-12T07:08:01.233 回答