Github“嵌套”存储库但不是子模块 真的吗?

问题描述

我想将包含许多子文件夹的整个文件夹推送到新的 github 存储库。问题是其中一些子文件夹包含 .git 和 .gitignore 所以它们本身就是 git repos。我希望这些子文件夹也被推送到我的新仓库,但不是作为子模块,而是作为包含自己文件的普通文件夹。

解决方法

你不能。

真的吗?

好吧,你大部分不能。

一个 Git 存储库不能包含另一个 Git 存储库。任何子目录中的 .git 目录告诉外部 Git,内部存储库是一个存储库。1 Git 将拒绝添加它,除非作为子模块。您可以重命名或删除 .git 目录,从而使子目录不再包含 Git 存储库。一旦内部工作树只是一个,而不是一个存储库,您就可以添加它。现在它只是文件,而不是提交,所以一切正常。如果你同意,就这样做;实现是微不足道的。 (这让我想知道您为什么将此作为问题发布。)

还有git subtree:见When to use git subtree?


1比那个稍微复杂一点,但是效果差不多。外部 Git 不会存储内部 Git 存储库的原因是,如果存储了,您可以创建一个存储库,该存储库在克隆时包含另一个带有预加载 .git/config 文件的存储库。此 .git/config 文件可能包含破坏安全性的说明,这些说明会导致破坏安全性。所以 Git 拒绝保存任何名为 .git 的东西。