内容来自 DOC https://q.houxu6.top/?s=如何移除子模块?
如何移除Git子模块?
为什么我不能执行git submodule rm module_name
命令?
自从 git1.8.3 (2013年4月22日) 起:
一旦你表达了对子模块的兴趣,
git submodule init
,就没有了“我不再对这个子模块感兴趣”的Porcelain方式。
git submodule deinit -f -- a/submodule
是这样做的方法。
删除过程也使用 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)
# 或者,如果你想把它留在工作树里,并已经执行了步骤0
3. git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule
解释
rm -rf
: 这是 Daniel Schroeder(https://stackoverflow.com/users/2753241/daniel-schroeder)在回答(https://stackoverflow.com/a/26505847/6309)中提出的,并由 Eonil(https://stackoverflow.com/users/246776/eonil)在评论(https://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule/16162000?noredirect=1#comment41729982_16162000)中提到的:
这样会保留
.git/modules/<path-to-submodule>/
不变。所以如果你曾经用这种方法删除了一个子模块,然后重新添加它们,它将不可能,因为仓库已经被破坏了。
git rm
: 参见 commit 95c16418(https://github.com/git/git/commit/95c16418f0375e2fc325f32c3d7578fba9cfd7ef):
目前使用 "
git rm
" 删除子模块会将子模块的工作树从超级项目的目录中移除,并将gitlink从索引中移除。
但是.gitmodules
中的submodule.<submodule name>
部分仍然没有改变,这是已删除子模块的遗留物,可能会让用户感到困扰(与.git/config
中的设置相反,这个必须留作提醒用户他们对该子模块感兴趣,以便稍后在检出较旧的提交时重新填充)。让 "
git rm
" 帮助用户通过不仅从工作树中删除子模块,还通过从.gitmodules
文件中删除 "submodule.<submodule name>
" 部分并执行两个步骤来帮助用户。
git submodule deinit
: 它源于这个补丁(http://git.661346.n2.nabble.com/PATCH-v3-submodule-add-deinit-command-td7576946.html):
使用
git submodule init
,用户可以告诉git他们对一个或多个子模块感兴趣,并希望在下一次调用git submodule update
时将其填充。
但是目前没有简单的方法让他们告诉git他们不再关心一个子模块,并希望删除本地工作树(除非用户对子模块的内部非常了解,并自己从.git/config
中删除了submodule.$name.url
设置以及工作树)。通过提供一个 '
deinit
' 命令来帮助这些用户。此 从
.git/config
中删除整个submodule.<name>
部分(对于给定的子模块)(或者对于所有已初始化的子模块,如果给定了'.
')。
失败,如果当前工作树包含修改,除非强制。
抱怨,对于在命令行上给出的子模块,无法在.git/config
中找到url设置,但尽管如此不失败。这将处理(de)初始化步骤(
.git/config
和.git/modules/xxx
)。
自 git1.8.5 起,git rm
还负责:
- '
add
' 步骤,它记录了子模块在.gitmodules
文件中的url:它是需要删除的。 - 子模块的特殊条目(如 此问题 所示):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函数的命令。
参见commit 2e61273、commit 1342476(2018年1月14日)由[Prathamesh Chavan(pratham-pc
)]提交。
(合并者:Junio C Hamano -- gitster
--(2018年2月13日),提交信息:git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit ${GIT_QUIET:+--quiet} ${prefix:+--prefix "$prefix"} ${force:+--force} ${deinit_all:+--all} "$@"