【发布时间】:2023-03-28 15:11:01
【问题描述】:
假设我有一个使用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 提供了非常狭窄的行为。我认为这是故意的。
【问题讨论】:
-
您的第三个要点要求是真正棘手的部分。在任何当前设计中都无法保证这一点,因为子模块存储库不是其超级项目的一部分。
-
@torek 是否有充分的理由很棘手 - 即首先这是一个不合理的要求,使用子树或其他东西?或者出于不好的原因:应该处理的设计中的空白?
-
这很棘手,因为正如 VonC 所说,原始设计假定您的子模块克隆没有价值:它可以随时丢弃,因为您可以随时重新克隆它,无需失去任何有价值的东西。这种假设仍然存在。
标签: git git-submodules