如何删除子模块,但保留其历史记录(与父历史记录链接)?

时间:2020-05-22 20:28:23

标签: git git-submodules

说我有一个项目,该项目具有使用git submodule实现的依赖项。现在,我正在进行更改,不再需要这种依赖关系。我要提交如下更改:

  • 如果有人签出此提交或任何后代,则子模块不存在。
  • 但是,如果有人签出了较旧的提交,或者另一个分支上的提交未与该分支合并,则子模块会重新出现,就像被删除的文件一样。
  • 必须保留子模块自己的git数据库(.git / modules / path / to / submodule),因为它可能包含未推送到远程的提交。

换句话说,我确实要按照How do I remove a submodule?的答案删除子模块。实际上,我写这个问题是为了澄清这个问题。[1]

我有空的时候会尝试一些实验。它可能很简单,例如git submodule deinit和/或从.gitsubmodules中删除其条目。我搜索了Stack Overflow,没有发现专门针对这种情况的问题或答案。甚至连精湛的Mastering Git submodules都不清楚。


[1]:这些答案中需要执行的许多步骤告诉我,这种消除不是“正常的”,否则git会包含一个瓷器命令来为您完成所有操作。相反,git deinit的行为非常狭窄。我认为这是故意的。

1 个答案:

答案 0 :(得分:1)

git submodule deinit that I documented in 2013及其关联的rm -rf .git/modules/a/submodule都假定已将删除的子模块推入。

最初将子模块引入为只读,以便将其他存储库内容带入您的存储库,而无意修改它们。
differs from subtree,更自然地希望进行修改。

话虽这么说,是的,如果您在未提交/推动该子模块的本地更改的情况下删除了一个子模块,则最终结果将不令人满意。

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

相关问题