移除git子模块时出现问题

13

我有一个关于删除git子模块的问题。我正在使用git来组织我的配置文件和vim插件,其中vim插件是子模块。现在我想要删除一个子模块(按照这里的说明),但我没有成功。

--git submodule deinit -f vim/bundle/snipmate-snippets
Submodule work tree 'vim/bundle/snipmate-snippets' contains a .git directory
(use 'rm -rf' if you really want to remove it including all of its history)

所以我尝试执行 rm -rf...

--git rm -rf vim/bundle/snipmate-snippets
error: the following submodule (or one of its nested submodules)
uses a .git directory:
    vim/bundle/snipmate-snippets
(use 'rm -rf' if you really want to remove it including all of its history)

我做错了什么?很明显,仅仅执行 rm -rf 命令是不够的,因为在 .gitmodules 文件中子模块的条目仍将存在。谢谢。


难道捆绑包不能为您删除它们吗?(顺便说一句:也许您应该为问题添加一些标签,比如“vim”和“vim-bundle”或类似的内容。) - musicmatze
感谢您的回复。'vim'和'vim/bundle'只是普通目录,我正在使用纯git。因此,vim/bundle/snipmate-snippets只是一个普通的目录,子模块被克隆到其中。它可以是任何其他目录,例如foo/bar/my_submodule或其他任何目录。 - rafalio
当然,但是Bundle会为你完成这个操作。我非常确定你可以通过在vimrc中删除插件条目并调用类似于“Bundle clean”的命令来删除插件。 - musicmatze
2个回答

20
你需要在没有git的情况下运行rm -rf命令。
rm -rf vim/bundle/snipmate-snippets

然后你可以取消初始化子模块:

git submodule deinit vim/bundle/snipmate-snippets

2
你将不再看到这个错误信息,因为Git 2.12 (2017年第一季度)已经解决了这个问题。
参见提交记录 55856a3(2016年12月27日),以及提交记录 83b7696提交记录 5a1c824提交记录 bd26756(2016年12月20日),作者为Stefan Beller (stefanbeller)
(由Junio C Hamano -- gitster --提交记录 3ccd681中合并,2017年1月18日) “rm”命令:在删除之前吸收子模块的Git目录
“git rm”曾经拒绝删除一个嵌入在其工作树中有自己的Git存储库的子模块。现在它学会了将存储库移动到超级项目的$GIT_DIR/modules/中,允许删除子模块(只要没有本地修改丢失)。
当删除子模块时,我们需要保留实际的Git目录,以便不会丢失其中的本地更改,并且在以后检出子模块时不需要再次克隆它。
现在已经可以吸收子模块的Git目录,重写git-rm中的检查,不是抱怨,而是重新定位超级项目中的Git目录。
这就是新测试 "当强制删除一个带有嵌套的.git目录的已填充嵌套子模块时失败" 现在所说明的内容。
使用 Git 2.35(2022 年第一季度),错误信息“really”将消失:“git submodule deinit(man),对于一个嵌入在其工作树中的 .git 元数据目录的子模块拒绝工作,直到子模块转换为使用“吸收”形式,其中元数据目录存储在超级项目中,并且子模块的工作树顶部有一个 gitfile 指向它。该命令已经学会根据需要将这些子模块转换为吸收形式。
查看 commit 0adc8ba(2021年11月19日)由Mugdha Pattnaik (mugdhapattnaik)提交。
(由Junio C Hamano -- gitster --commit 670703e合并,2021年12月10日)子模块:吸收git目录而不是在取消初始化时失败”

建议者:Atharva Raykar
签署者:Mugdha Pattnaik

目前,在子模块的“.git”是一个目录的存储库上运行“'git submodule deinit'(man)”会中止,并显示一条不太友好的消息。让我们改为警告用户.git/目录已被吸收到超级项目中。其余的deinit函数可以像新样式子模块一样操作。在一个测试中,即使使用--force选项时,当子模块的.git/目录未被吸收时,我们过去也需要“git submodule deinit”失败。将其调整为期望操作通过。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接