添加通用代码作为git子模块的问题:“已经存在于索引中”
我是新来的混帐,并会感谢帮助添加子模块。 我收到了两个共享一些通用代码的项目。 共享代码只是复制到两个项目中。 我为通用代码创build了一个单独的git仓库,并将其从项目中删除,并将其添加为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子模块直接添加到回购站中,或者直接添加到新文件夹中,但不能添加到项目文件夹中。 问题是,它真的需要在项目文件夹..我能做些什么,我有什么误解了git子模块的path选项添加?
恐怕没有足够的信息来确定发生了什么事情,因为你没有回答我的后续问题,但这可能对你有帮助。
该错误意味着项目文件projectfolder
已经上演(“已经存在于索引中”)。 要了解这里发生了什么,请尝试列出该文件夹下索引中的所有内容:
git ls-files --stage projectfolder
该输出的第一列将告诉你在projectfolder
的索引中有什么types的对象。 (这些看起来像Unix文件模式,但在git中有特殊的含义。)
我怀疑你会看到像这样的东西:
160000 d00cf29f23627fc54eb992dde6a79112677cd86c 0 projectfolder
(即以160000
开始的行),在这种情况下, projectfolder
的存储库已经添加为“gitlink”。 如果它没有出现在git submodule
的输出中,并且你想重新添加它作为子模块,你可以这样做:
git rm --cached projectfolder
把它卸下来,然后:
git submodule add url_to_repo projectfolder
…将存储库作为子模块添加
但是,也可能会看到许多列出的斑点(文件模式为100644
和100755
),这会向我build议,在将新的存储库复制projectfolder
之前,没有正确projectfolder
文件projectfolder
的文件。 如果是这种情况,您可以执行以下操作来取消所有这些文件:
git rm -r --cached projectfolder
…然后添加子模块:
git submodule add url_to_repo projectfolder
我有同样的问题,并在几个小时后find答案。
我得到的错误是有点不同: <path> already exists and is not a valid git repo
(在这里增加了SEO值)
解决scheme是不创build将容纳子模块的目录。 该目录将作为git submodule add
命令的一部分被创build。
另外,这个参数预计是相对于父回购的根,而不是你的工作目录,所以要小心。
上面的例子的解决scheme:
- 你父母的回购已经克隆好了。
- 确保
common_code
目录不存在。 -
cd Repo
-
git submodule add git://url_to_repo projectfolder/common_code/
( 注意所需的尾部斜线。 ) - 理智恢复。
我希望这有助于某人,因为在其他地方找不到有关这方面的信息。
手动删除子模块涉及到一些步骤,这对我有效。
假设你在项目根目录下,并且示例git模块名称是“c3-pro-ios-framework”
删除与子模块关联的文件
rm -rf .git/modules/c3-pro-ios-framework/
删除对config中子模块的引用
vim .git/config
删除.gitmodules
rm -rf .gitmodules
从caching中删除它没有“混帐”
git rm --cached c3-pro-ios-framework
添加子模块
git submodule add https://github.com/chb/c3-pro-ios-framework.git
如果在git控制下有一个名为x
的文件夹,你想要添加一个同名的子模块,你应该先删除文件夹x
并提交它 。
@ ujjwal-singh更新:
提交是不需要的,分期足够.. git add
/ gir rm -r
我是这样做的。 从一个空的回购开始,将子模块添加到名为“projectfolder / common_code”的新文件夹中。 之后,可以在项目文件夹中添加项目代码。 细节如下所示。
在一个空的回购types中:
git submodule add url_to_repo projectfolder/common_code
这将创build所需的文件夹结构:
repo |-- projectfolder |-- common_code
现在可以添加更多的子模块,项目代码可以添加到项目文件夹中。
我不能说为什么它这样做,而不是其他。
只是为了澄清在人类的语言错误是想告诉你:
您不能在已经在主资源库中跟踪的文件夹中创build资源库。
例如:你有一个名为AwesomeTheme
的主题文件夹,它是一个专用的存储库,你可以直接把它转储到你的主存储库,比如git submodule add sites/themes
,你会得到这个"AwesomeTheme" index already exists
。
你只需要确定在主版本库的版本跟踪中还没有sites/themes/AwesomeTheme
,这样子模块就可以在那里创build了。
所以要解决,如果你有一个空的sites/theme/AwesomeTheme
目录,然后将其删除,在您的主要存储库。 如果您已经在主仓库中提交了sites/theme/AwesomeTheme
目录,则需要使用如下命令清除其所有历史logging:
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
看到过任何东西(又名索引),现在可以创build它了。
不知道这是否有用,尽pipe当我尝试从IntelliJ 15中提交文件时遇到了同样的问题。最后,我打开了SourceTree,在那里我可以简单地提交该文件。 问题解决了。 不需要发出任何奇特的git命令。 只要提到它,以防万一任何人有同样的问题。
在你的git目录中,假设你已经同步所有的改变。
rm -rf .git rm -rf .gitmodules
然后做:
git init git submodule add url_to_repo projectfolder