Github子模块:如何删除或排除子模块?
自从 git1.8.3(2013年4月22日)以来,如果你通过“git submodule init”表达了对子模块的兴趣,则没有 Porcelain 方法表达“我不再对该子模块感兴趣”。现在有了“git submodule deinit”函数可以实现。
删除过程还使用了git rm(自git1.8.5 2013年10月起)。
因此,删除 3 步骤的过程如下:
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 rm
"通过从".gitmodules
"文件中删除子模块名为“submodule.
git submodule deinit:它源自该补丁:通过“git submodule init”,用户可以告诉 Git 他们关心一个或多个子模块,并希望在下次调用“git submodule update”时填充它。但目前,如果用户不关心子模块,不想再保留该工作树,他们无法轻松地告诉 git(除非用户了解有关子模块内部的很多知识并自己从.git/config
中删除了“submodule.deinit
"命令,帮助那些用户。
在给定的子模块(如果给出“.
”,则为已初始化子模块)中从.git/config
中删除整个submodule.
部分。
除非强制执行,否则如果当前工作树中包含修改,则失败。
如果对于在命令行上给定的子模块,在.git/config
中找不到URL设置,则抱怨,但不会失败。
这将处理(取消)初始化步骤(.git/config
和.git/modules/xxx
)
自git1.8.5以来,git rm
也负责:
- “
add
”步骤将子模块的URL记录在.gitmodules
文件中:需要为您删除它。 - 子模块特殊条目(如本问题所示):git rm将其从索引中删除:
git rm --cached path_to_submodule
(无尾随斜杠)
这将删除以特殊模式“160000”存储在索引中的该目录,标记它为子模块根目录。
如果您忘记了最后一步,并尝试将子模块作为常规目录添加,则会收到类似以下错误消息:
git add mysubmodule/file.txt Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
注意:自Git 2.17(2018年第二季度)以来,git submodule deinit不再是一个shell脚本。
它是对C函数的调用。
请参见提交2e61273,提交1342476(由Prathamesh Chavan(pratham-pc
)于2018年1月14日提交)。
(由Junio C Hamano -- gitster
--于2018年2月13日在提交ead8dbe中合并)
git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \ ${GIT_QUIET:+--quiet} \ ${prefix:+--prefix "$prefix"} \ ${force:+--force} \ ${deinit_all:+--all} "$@"
在现代的git中(我是在2022年编写的,使用更新的git
版本),这变得更加简单:
- 运行
git rm
,然后提交。
这将删除
处的文件树以及子模块在.gitmodules
文件中的条目。也就是说,你的仓库中所有子模块的痕迹都被删除了。
然而,正如文档所述,子模块的.git
目录仍然保留(在主项目的.git
目录的modules/
目录中),“以便在无需从其他仓库获取时检出过去的提交”。
如果你仍然想要删除这些信息,可以手动删除.git/modules/
中的子模块目录,并删除文件.git/config
中子模块的条目。这些步骤可以使用以下命令自动完成:
rm -rf .git/modules/
,以及git config --remove-section submodule.
。
旧的社区维基指南:
要删除一个子模块,你需要:
- 从
.gitmodules
文件中删除相关部分。 - 暂存
.gitmodules
的更改:git add .gitmodules
- 从
.git/config
文件中删除相关部分。 - 从工作树和索引中删除子模块文件:
git rm --cached path_to_submodule
(没有尾部斜杠)。 - 删除子模块的
.git
目录:rm -rf .git/modules/path_to_submodule
- 提交更改:
git commit -m "Removed submodule
" - 删除现在未跟踪的子模块文件:
rm -rf path_to_submodule
另请参阅:以下替代步骤。