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


225

我是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

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


如果这样做,您会得到什么git ls-files --stage projectfolder
马克·朗伊尔

我得到了所有内容都从100644开始的列表。–
Vanja


8
对我来说git rm,在现有文件夹上进行操作有助于:|
rogerdpack

Answers:


343

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

该错误意味着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

12
感谢Mark的详细回答。我做了一个“ git rm -r --cached projectfolder”并试图再次尝试访问子模块。但是,这次我得到错误信息:“'projectfolder'已经存在,并且不是有效的git repo”。
Vanja 2012年

3
@Vanja:表示projectfolder不包含.git目录。从您的问题听起来,好像您是在projectfolder其他地方创建了新的存储库,然后将其复制到位,但显然并非如此。您需要先移开现有projectfolder的存储库,然后将新的存储库(包含其.git目录)复制到位,然后再添加为子模块。或者,如果您已经将其推送到所代表的存储库中url_to_repo,则可以移开projectfolder路径,然后从该URL添加子模块。
Mark Longair

真棒答案+1一路
abbood

这帮助了我很多。谢谢!
埃文·莫兰

1
这就是我所做的,这是3个步骤的过程第1步:git rm -r --cached src / test / resources /,第2步:将现有资源目录移至其他位置,第3步:git子模块add add url_to_repo src /测试/资源
vikramvi

52

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

假设您位于项目的根目录中,并且示例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

2
很棒的帖子,很棒。先生,很高兴与您分享。非常好。
gabn88 '17

1
我尝试通过git submodule删除后和添加前列出子模块,这给了我一个错误,提交删除会解决这个问题。
mehmet

1
如果可以的话,我将投票提高50倍。你刚刚拯救了我的一天!
Sensei James

touch .gitmodules(需要在工作树中,因此将其删除会有所帮助。但是您需要再次将其重新添加)。真棒帖子顺便说一句。唯一在这里起作用的东西。
Torxed

.git目录对我来说仍然有残留。这很棒。谢谢。
凯文·安德森

44

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

rm -rf projectfolder

git rm -r projectfolder

然后添加子模块

git submodule add <git_submodule_repository> projectfolder

4
git submodule add --force <git_submodule_repository>为我工作,以保持相同的子模块名称
Tenfrow,

1
谢谢!!我不必在项目文件夹中添加,只需将其更改为子目录并从那里进行克隆。
托尼·弗雷泽

32

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

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

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

另外,该参数应该相对于parent-repo根目录,而不是您的工作目录,因此请当心。

上面示例的解决方案:

  1. 可以已经克隆了您的父仓库。
  2. 确保common_code目录也不会存在。
  3. cd Repo
  4. git submodule add git://url_to_repo projectfolder/common_code/请注意必填的斜杠。
  5. 恢复理智。

我希望这对某人有帮助,因为在其他地方几乎找不到这方面的信息。


1
第4步应该开始git submodule add,并且不需要尾部斜杠。
nullability 2013年

修正了打字错误。我已经对其进行了重新测试,并且斜杠对我产生了影响。我正在使用zsh,如果有任何效果。
2013年

这解决了我的问题(使用add子模块commnand创建目录),谢谢!
jackJoe

18

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

由@ ujjwal-singh更新:

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


我错过了那个承诺。简短的答案,但正确的一个!
Qqwy

3
承诺是不需要的,分期就足够了.. git add/gir rm -r
Ujjwal辛格

3

只是为了以人类语言来说明错误试图告诉您什么:

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

例如:您有一个名为的主题文件夹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,因此现在可以创建它。


1

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

在一个空的仓库中输入:

git submodule add url_to_repo projectfolder/common_code

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

repo
|-- projectfolder
    |-- common_code

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

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


0

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


0

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


0

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

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


-18

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

rm -rf .git 

rm -rf .gitmodules

然后做:

git init
git submodule add url_to_repo projectfolder

2
这将删除项目的整个历史记录!
抢劫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.