public 存储库中的私有文件夹(子模块)

Private folder (submodule) in a public repo

我有一个 public 存储库。在其中我想使用一个私有的子模块。如果我将此子模块包含到我的 public 存储库中,每个人都能看到该子模块的内容吗?

否:在 public 存储库中包含子模块意味着将其 URL 记录在 public .gitmodules 文件中。

那个 URL 的存储库将不会比它自己更容易通过存储库的递归克隆访问。

这就是为什么,例如,使用 submodules with GitHub Pages 是不可能的:

You can only use submodules with GitHub Pages sites that point to public repositories.
Using a submodule that points to a private repository is not possible because the Pages server cannot access private repositories.

如果您将带有子模块的分支推送到 public 存储库,这意味着 public 将能够看到子模块的 URL。 public 是否可以看到子模块的 内容 取决于您是否让 public 可以访问它。例如,如果您将它放在私有 Git 集线器存储库中,public 将能够看到 URL 但无法访问内容。

所有添加子模块实际上所做的就是在 .gitmodules 中添加一个条目到 url,它不会粘贴到该存储库的内容中。 URL 是否 public 可以访问完全是另一回事。

如果您甚至想将私有存储库的 URL 保持为私有,则必须在单独的本地分支上工作,并且永远不要将该分支推送到 public 存储库。例如

git clone somePublicRepo
cd somePublicRepo
git branch neverPushThisBranch
git checkout neverPushThisBranch
git submodule add privateRepo
git submodule update

由于描述存储库包含哪些子模块的文件 (.gitmodules) 与 Git 中的任何其他文件一样被签入,如果您在分支上签出子模块,没有人会看到子模块,除非您将分支推到 public 位置。

这就是不同的 git 分支可以有不同的子模块集的方式。

使用这种方法,您需要严格遵守分支机构的工作方式,以免不小心将您的私有分支机构推向世界。