我如何移除子模块?

我如何删除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将其从索引中删除:
    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文件中删除相关部分。
  • Stage .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

    上一篇: How do I remove a submodule?

    下一篇: Differences between HashMap and Hashtable?