Github子模块:如何删除或排除子模块?

10 浏览
0 Comments

Github子模块:如何删除或排除子模块?

如何删除 Git 子模块?为什么我不能使用 git submodule rm module_name

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

自从 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..url”设置以及工作树)。提供一个"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} "$@"

0
0 Comments

在现代的git中(我是在2022年编写的,使用更新的git版本),这变得更加简单:

  • 运行git rm ,然后提交

这将删除处的文件树以及子模块在.gitmodules文件中的条目。也就是说,你的仓库中所有子模块的痕迹都被删除了。

然而,正如文档所述,子模块的.git目录仍然保留(在主项目的.git目录的modules/目录中),“以便在无需从其他仓库获取时检出过去的提交”。
如果你仍然想要删除这些信息,可以手动删除.git/modules/中的子模块目录,并删除文件.git/config中子模块的条目。这些步骤可以使用以下命令自动完成:

  • rm -rf .git/modules/,以及
  • git config --remove-section submodule.


旧的社区维基指南:

通过Git Submodule Tutorial页面:

要删除一个子模块,你需要:

  1. .gitmodules文件中删除相关部分。
  2. 暂存.gitmodules的更改:
    git add .gitmodules
  3. .git/config文件中删除相关部分。
  4. 从工作树和索引中删除子模块文件:
    git rm --cached path_to_submodule(没有尾部斜杠)。
  5. 删除子模块的.git目录:
    rm -rf .git/modules/path_to_submodule
  6. 提交更改:
    git commit -m "Removed submodule "
  7. 删除现在未跟踪的子模块文件:
    rm -rf path_to_submodule

另请参阅以下替代步骤

0