我如何移除子模块?
我如何删除Git子模块?
顺便说一句,有没有我不能简单做的原因
git submodule rm whatever
?
由于git1.8.3(2013年4月22日):
一旦您表达您对子模块具有“ submodule init
”的兴趣,就没有瓷器方式说“我不再对这个子模块感兴趣”。
“ submodule deinit
”是这样做的方式。
删除过程也使用git rm
(自2013年10月git1.8.5起)。
概要
然后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
:丹尼尔施罗德的回答中提到了这一点,Eonil在评论中总结道:
这会使.git/modules/<path-to-submodule>/
不变。
因此,如果您一旦使用此方法删除子模块并重新添加它们,就不可能,因为存储库已损坏。
git rm
:见提交95c16418:
目前,在子模块上使用“ git rm
”会从超级项目和从索引开始的gitlink中删除子模块的工作树。
但是.gitmodules
的子模块部分保持不变,这是现在删除的子模块的剩余部分,并且可能会刺激用户(与在.git/config
设置相反,这必须留在提醒用户对此子模块感兴趣所以稍后当更旧的提交被签出时它会被重新填充)。
让“ git rm
”帮助用户不仅从工作树中删除子模块,而且还从.gitmodules
文件中删除“ submodule.<submodule name>
”部分,并将.gitmodules
同时.gitmodules
。
git submodule deinit
:它来源于这个补丁:
使用“ git submodule init
”,用户可以告诉git他们关心一个或多个子模块,并希望在下次调用“ git submodule update
”时填充它。
但是目前没有简单的方法,他们可以告诉git他们不再关心子模块,并且想要摆脱本地工作树(除非用户知道很多关于子模块内部组件并删除“ submodule.$name.url
”从.git/config
一起设置自己的工作树)。
通过提供' deinit
'命令帮助这些用户。
这将从给定的子模块 (或所有那些已经初始化,如果给出' .
'的子模块)从.git/config
删除整个submodule.<name>
部分 。
如果当前工作树包含修改,除非强制,否则失败。
当在命令行上给出的子模块时,抱怨在.git/config
找不到url设置,但仍然不会失败。
这需要注意如果(de)初始化步骤( .git/config
和.git/modules/xxx
)
由于git1.8.5, git rm
也会照顾:
add
'步骤将子模块的URL记录在.gitmodules
文件中:它需要为您删除。 git rm --cached path_to_submodule
(无尾随斜线) 这将使用特殊模式“160000”删除存储在索引中的该目录,并将其标记为子模块根目录。
如果您忘记了最后一步,并尝试将子模块添加为常规目录,则会收到如下错误消息:
git add mysubmodule/file.txt
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
注意:自Git 2.17(Q2 2018)以来,git submodule deinit不再是shell脚本。
这是一个C函数的调用。
见Prathamesh Chavan( pratham-pc
)提交2e61273,提交1342476(2018年1月14日)。
(由Junio C gitster
合并 - 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 Submodule教程:
要删除子模块,您需要:
.gitmodules
文件中删除相关部分。 .gitmodules
更改git add .gitmodules
.git/config
删除相关部分。 git rm --cached path_to_submodule
(没有结尾斜杠)。 rm -rf .git/modules/path_to_submodule
git commit -m "Removed submodule <name>"
rm -rf path_to_submodule
另请参阅 :下面的替代步骤。
只是一个笔记。 既然git 1.8.5.2,两个命令会做:
git rm the_submodule
rm -rf .git/modules/the_submodule
正如@Mark Cheverton的答案指出的那样,如果第二行没有被使用,即使你现在已经移除了子模块,剩余的.git / modules / the_submodule文件夹将会阻止相同的子模块在未来被添加回或替换。 另外,正如@VonC所提到的, git rm
将完成子模块的大部分工作。
- 更新(07/05/2017) -
只是为了澄清, the_submodule
是项目中的子模块的相对路径。 例如,如果子模块位于子目录subdir
内, subdir/my_submodule
。
正如在注释和其他答案中指出的那样,这两个命令(虽然在功能上足以移除子模块),但在.git/config
[submodule "the_submodule"]
部分留下痕迹(截至2017年7月)可以使用第三个命令删除:
git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null
链接地址: http://www.djcxy.com/p/323.html