我如何删除子模块?

13 浏览
0 Comments

我如何删除子模块?

我该如何移除Git子模块?

为什么我不能使用 git submodule rm module_name 呢?

admin 更改状态以发布 2023年5月21日
0
0 Comments

自从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还负责以下事项:

  • “add”步骤还会在.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 2e61273commit 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} "$@"
    

    (原文为英文,没有需要翻译的内容)

    0
    0 Comments

    在现代的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另请参见:以下替代步骤

    0