我如何删除子模块?
自从git 1.8.3(2013年4月22日)发布以来:
一旦使用"
git submodule init
"表达了对子模块的兴趣,就没有 Porcelain 方式表达"我不再对此子模块感兴趣"。"git submodule deinit
"就是这样的方式。
删除过程还使用了git rm
(自 git1.8.5 2013年10月)。
概要
三步删除过程如下:
0. mv a/submodule a/submodule_tmp 1. git submodule deinit -f -- a/submodule 2. rm -rf .git/modules/a/submodule 3. git rm -f a/submodule # Note: a/submodule (no trailing slash) # or, if you want to leave it in your working tree and have done step 0 3. git rm --cached a/submodule 3bis mv a/submodule_tmp a/submodule
解释
rm -rf
:这在丹尼尔·施罗德(Daniel Schroeder)的答案中提到,由Eonil在评论中总结:
这不会改变
.git/modules/
的内容。/
因此,如果使用此方法删除子模块,然后再次添加它们,就不可能了,因为仓库已经损坏。
git rm
:参见提交 95c16418:
目前,在子模块上使用"
git rm
"会从超级项目和索引中删除子模块的工作树和 gitlink。
但是.gitmodules
中的子模块部分不会受到影响,这是已经移除的子模块的剩余部分,可能会让用户感到困惑(与.git/config
中的设置相反,此部分必须保持不变,以提醒用户对此子模块表示了兴趣,因此在检出旧提交时,它将再次被填充)。
让 "git rm
" 帮用户不仅从工作树中删除子模块,而且还从 .gitmodules
文件中删除 "submodule.
" 部分,并将其暂存。
git submodule deinit
:它来源于这个补丁:
通过 "git submodule init
",用户可以告诉 git 他关心一个或多个子模块,并且希望在下一次调用 "git submodule update
" 时将其填充。但是,目前,他们没有简单的方法告诉 git 他们不再关心子模块了,并希望摆脱本地工作树(除非用户非常了解子模块内部,并自己从 .git/config
中删除 "submodule.$name.url
" 设置以及工作树)。
通过提供 "deinit
" 命令来帮助这些用户。这删除给定子模块的整个 submodule.
部分(或者对于已经初始化的所有子模块,如果给出 '.
')。如果强制执行,则会在当前工作树包含修改时失败。如果在命令行中给定的子模块的 url 设置在 .git/config
中找不到,则抱怨但仍不失败。
这负责 (de)initialization 步骤 (.git/config
和 .git/modules/xxx
)。自从Git1.8.5之后,git rm
还负责以下事项:
.gitmodules
文件中记录子模块的url,需要将其删除git rm --cached path_to_submodule
(没有斜杠)可以将其从索引中删除,这将删除以"160000"特殊模式存储在索引中的该目录,标记它为子模块的根目录。如果您忘记了最后一步,并尝试将子模块添加为常规目录,您会收到类似以下错误消息:
git add mysubmodule/file.txt Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
注意:自Git2.17(2018年第二季度)以来,git子模块的deinit不再是shell脚本。
它是对一个C函数的调用。
参见commit 2e61273,commit 1342476(由Prathamesh Chavan (pratham-pc
)于2018年1月14日提交)。
(由Junio C Hamano (gitster
)在2018年2月13日提交的commit ead8dbe合并)
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \ ${GIT_QUIET:+--quiet} \ ${prefix:+--prefix "$prefix"} \ ${force:+--force} \ ${deinit_all:+--all} "$@"
(原文为英文,没有需要翻译的内容)
在现代的git中(我是在2022年编写本文的,并使用更新的git
版本),这变得更加简单:\n\n- 运行git rm
并提交。\n\n这会删除在.gitmodules
文件中的子模块条目以及
处的文件树。也就是说,你的存储库中所有子模块的痕迹都被删除了。\n\n然而,正如文档中所述,子模块的.git
目录被保留下来(在主项目的.git
目录下的modules/
目录中),为了“使之前的提交可检出而无需从另一个存储库获取”。\n如果你仍想删除此信息,请手动删除.git/modules/
目录中的子模块目录,并从文件.git/config
中删除子模块的条目。可以使用以下命令自动化这些步骤:\n\n- rm -rf .git/modules/
\n- git config --remove-section submodule.
\n\n旧的社区wiki说明:\n\n通过页面Git Submodule Tutorial:\n\n- 从.gitmodules
文件中删除相关部分。\n- 暂存.gitmodules
更改:git add .gitmodules
\n- 从.git/config
中删除相关部分。\n- 从工作树和索引中删除子模块文件:git rm --cached path_to_submodule
(没有斜线)。\n- 删除子模块的.git
目录:rm -rf .git/modules/path_to_submodule
\n- 提交更改:git commit -m \"Removed submodule
\n- 删除不再跟踪的子模块文件:rm -rf path_to_submodule
\n\n另请参见:以下替代步骤。