如何删除一个子模块,但保留它的历史记录(从父历史记录中链接)?

问题描述 投票:1回答:1

假设我有一个项目,这个项目的依赖关系是通过使用 git submodule. 现在我正在做一个改变,不再需要这个依赖关系。我想提交一个变化,如下所示。

  • 如果有人检查了这个提交或其他子模块,这个子模块就不存在了。
  • 但如果有人检查了更早的提交,或者是其他分支的提交,但没有和这个提交合并,子模块就会重新出现,就像被删除的文件一样。
  • 子模块自己的git数据库(.gitmodulespathtosubmodule)必须保留,因为它可能包含没有推送到远程的提交。

换句话说,我做了 想按照以下答案的指示删除子模块。如何删除一个子模块?. 其实我写这个问题是为了说明这个问题的反面教材[1] 。

当我有时间的时候,我会尝试一些实验。它可能是简单的 git submodule deinit 或将其条目从 .gitsubmodules. 我在Stack Overflow上搜索了一下,没有发现任何针对这个案例的问题或答案。即使是写得极好的 掌握Git子模块 是不清楚的。


[1]: 这些答案中所需要的许多步骤告诉我 这种抹杀是不 "正常 "的 否则git就会包含一个瓷器命令来帮你完成所有的工作 相反 git deinit 是提供非常狭窄的行为。我认为这是非常有意的。

git git-submodules
1个回答
0
投票

这个 git submodule deinit 我在2013年记录的 及其相关的 rm -rf .git/modules/a/submodule 都假设被移除的子模块已经被推送了。

子模块最初被引入是作为只读使用的,为了让其他版本库的内容进入你的版本库,不一定要修改它们。这个 不同于子树在这里,修改是更自然的预期。

也就是说,是的,如果你在删除一个子模块的同时,还没有对该子模块进行推送的本地修改,那么最终的结果将不会令人满意。

一个可能的补丁想法是,当git子模块检测到子模块当前的HEAD与它自己的内部远程跟踪分支(它自己的)不匹配时,阻止fail git子模块deinit命令。origin/master 例如)

© www.soinside.com 2019 - 2024. All rights reserved.