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

Issue with adding common code as git submodule: “already exists in the index”

我是git的新手,不胜感激添加子模块的帮助。
我收到了两个共享一些通用代码的项目。 共享的代码仅被复制到两个项目中。 我为通用代码创建了一个单独的git repo,并将其从项目中删除,并计划将其添加为git子模块。

我使用git子模块添加的path选项来指定文件夹:

1
git submodule add url_to_repo projectfolder

但随后出现错误:

1
'projectfolder' already exists in the index"

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

1
2
3
repo
|-- projectfolder
    |-- folder with common code

可以将git子模块直接添加到存储库中,也可以添加到新文件夹中,但不能添加到项目文件夹中。 问题在于它确实需要在项目文件夹中。
我该怎么办?我对git submodule add的path选项有什么误解?


恐怕您的问题中没有足够的信息来确定正在发生的事情,因为您尚未回答我的后续问题,但这在任何情况下都可能会有所帮助。

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

1
git ls-files --stage projectfolder

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

我怀疑您会看到类似以下内容:

1
160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0   projectfolder

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

1
git rm --cached projectfolder

...取消登台,然后:

1
git submodule add url_to_repo projectfolder

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

但是,您也可能会看到列出了许多斑点(文件模式为100644100755),这向我建议您在将新存储库复制到位之前,您没有正确地撤消projectfolder中的文件。 。在这种情况下,您可以执行以下操作以取消登台所有这些文件:

1
git rm -r --cached projectfolder

...然后使用以下方式添加子模块:

1
git submodule add url_to_repo projectfolder


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

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

删除与子模块关联的文件

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

在配置中删除对子模块的任何引用

1
vim .git/config

enter image description here

删除.gitmodules

1
rm -rf .gitmodules

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

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

添加子模块

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


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

我得到的错误有所不同: 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/(请注意必需的斜杠。)
  • 恢复理智。
  • 我希望这对某人有帮助,因为在其他地方几乎找不到这方面的信息。


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

    1
    2
    3
    rm -rf projectfolder

    git rm -r projectfolder

    然后添加子模块

    1
    git submodule add <git_submodule_repository> projectfolder

    如果在git的控制下有一个名为x的文件夹,则要添加相同名称的子模块,应删除文件夹x并首先提交。

    由@ ujjwal-singh更新:

    git add / git rm -r


    只是要用人类语言来说明错误试图告诉您什么:

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

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

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

    因此要解决,如果您的主存储库中有一个sites/theme/AwesomeTheme空目录,则将其删除。如果您已经使用主存储库中的sites/theme/AwesomeTheme目录进行了提交,则需要使用以下命令清除其所有历史记录:

    1
    2
    git filter-branch --index-filter \
                  'git rm -r --cached --ignore-unmatch sites/theme/AwesomeTheme'     HEAD

    现在您可以运行git submodule add [email protected] sites/themes/AwesomeTheme

    由于主存储库以前从未在sites/themes/AwesomeTheme中看到任何内容(也称为索引),因此现在可以创建它。


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

    在一个空的仓库中输入:

    1
    git submodule add url_to_repo projectfolder/common_code

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

    1
    2
    3
    repo
    |-- projectfolder
        |-- common_code

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

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


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


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


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

    1
    2
    3
    rm -rf .git

    rm -rf .gitmodules

    然后做:

    1
    2
    git init
    git submodule add url_to_repo projectfolder