我是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
可以直接在repo中添加git子模块,也可以将其添加到新文件夹中,但不能添加到项目文件夹中。问题是它确实需要在项目文件夹中。我能做些什么以及我对git submodule add的路径选项误解了什么?
我担心你的问题中没有足够的信息来确定发生了什么,因为你没有回复我的后续问题,但这在任何情况下都可能有所帮助。
该错误意味着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 -rf .git
rm -rf .gitmodules
然后做:
git init
git submodule add url_to_repo projectfolder
手动删除子模块涉及多个步骤,这对我有用。
假设您在项目根目录中并且示例git模块名称是“c3-pro-ios-framework”
删除与子模块关联的文件
rm -rf .git/modules/c3-pro-ios-framework/
删除config中对子模块的任何引用
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
我有同样的问题,经过几个小时的寻找找到答案。
我得到的错误有点不同:<path> already exists and is not a valid git repo
(并在这里添加了SEO值)
解决方案是不创建将容纳子模块的目录。该目录将作为git submodule add
命令的一部分创建。
此外,参数预计与父 - repo根相关,而不是您的工作目录,因此请注意。
以上示例的解决方案:
common_code
目录不存在。cd Repo
git submodule add git://url_to_repo projectfolder/common_code/
(注意所需的尾随斜线。)我希望这对某人有所帮助,因为其他地方的信息很少。
您需要首先删除您的子模块git存储库(在本例中为projectfolder)以获取git路径。
rm -rf projectfolder
git rm -r projectfolder
然后添加子模块
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
目录进行了提交,则需要使用如下命令清除它的所有历史记录:
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
中看到任何东西(a.k.a index'd),现在它可以创建它。
我通过相反的方式实现了它。从空仓库开始,将子模块添加到名为“projectfolder / common_code”的新文件夹中。之后,可以在项目文件夹中添加项目代码。详情如下。
在空的回购类型中:
git submodule add url_to_repo projectfolder/common_code
这将创建所需的文件夹结构:
repo
|-- projectfolder
|-- common_code
现在可以添加更多子模块,项目代码可以添加到项目文件夹中。
我还不能说为什么它以这种方式工作而不是另一方面。
不知道这是否有用,虽然我在尝试从IntelliJ 15中提交我的文件时遇到了同样的问题。最后,我打开了SourceTree,在那里我可以简单地提交文件。问题解决了。无需发出任何花哨的git命令。只要提及它,以防任何人有同样的问题。
转到存储库文件夹。从.gitmodules中删除相关的子模块。选择显示隐藏文件。转到.git文件夹,从模块文件夹和配置中删除子模块。