【问题标题】:How to remove a submodule going forward, but keep its history (as linked from parent history)?如何继续删除子模块,但保留其历史记录(与父历史记录链接)?
【发布时间】: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


【解决方案1】:

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

最初引入子模块以只读方式使用,以便将其他存储库内容放入您的存储库,而不必修改它们。
这个differs from subtree,更自然地期待修改。

话虽如此,是的,如果您删除子模块而没有提交/推送对所述子模块的本地更改,最终结果将不会令人满意。

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

【讨论】:

  • 谢谢。我遇到了这个问题,我之前在我的项目中添加了一个第三方库作为子模块,这样我就可以根据父项目的需要进行本地修改。我没有使用子树,因为我看到了自己模块的解决方案,而不是第三方模块的模块(我可能错了)。我已经意识到节点的package.json 支持本地未发布的模块,所以现在改为这样做(参见stackoverflow.com/a/61961021/8910547)。但我仍然希望能够回到使用废弃解决方案的旧提交。
  • @Inigo 我很了解 Christophe 2015 年的旧文章。但是从那时起,已经在子模块上完成了 lot
  • @Inigo 在执行deinit 时,rm 步骤是必需的。因此,我的补丁想法是让 Git 更适合您的用例。
  • 有必要因为可能在同一路径添加不同的子模块(不同的repo)?
  • 这个新问题很重要,应该在 Git 邮件列表中讨论:请在此处打开它。
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2017-06-16
相关资源
最近更新 更多