将公共代码添加为 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(文件模式为 100644
和 100755
),这表明您在复制新文件之前没有正确取消暂存 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 <git_submodule_repository>
帮助我保持相同的子模块名称
谢谢!!我不必在项目文件夹中添加,我只是更改到子目录并从那里克隆。
你是个天才!【参考方案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】:
我遇到了同样的问题,经过数小时的寻找找到了答案。
我得到的错误有点不同:<path> 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 submodule update --init --recursive
git submodule update --init --recursive
git submodule update --init --recursive