在克隆之前,如何知道Git存储库是否包含子模块?

问题描述

在克隆之前,是否可以知道Git存储库中是否包含子模块,如果可以,它们是什么以及它们的URL是什么?

此外,子模块可以有自己的子模块吗?如果可以,Git允许多少级层次结构?

解决方法

Github之类的托管服务提供git存储库浏览器。在浏览器中,我们可以看到特定提交的文件和文件夹。如果存储库具有一个或多个子模块,则它肯定具有.gitmodules.gitmodules中列出了子模块的名称,路径和url。

某些托管服务(不包括Github)还允许git archive --remote下载特定文件。

git archive --remote=<url_to_repository> --format=zip master .gitmodules | gunzip -

如果存储库的.gitmodules中存在master,该命令将打印其内容。我们可以检查其中是否列出了子模块。

子模块可以具有自己的子模块。这些水平在理论上是不定式的。提交仅记录其自己的子模块,并且不知道或不在乎其子模块是否具有任何子模块。如果签出路径过长,可能会出现错误,从而限制了实践中的级别。

,

对此没有一个完美的答案,因为子模块的存在很棘手。 ElpieKay's answer是检查.gitmodules文件的好方法,它是获取close enough for all practical purposes的好方法。我将在这里进入杂草丛生的部分。

这里的问题是,在 commit 中,子模块由Git内部调用 gitlink 的实体表示。 gitlink包含路径名(Git认为是文件名,例如path/to/submodule 1 )和某些Git存储库中某些提交的提交哈希ID。 2 这使我们可以更深入地研究您的问题。

...以及他们的网址是什么?

这部分很棘手,因为子模块的 initial URL必须来自某个地方,但是一旦对子模块进行了git clone编辑,Git 就不再关心网址为。现在,子模块只是一个Git存储库。

.gitmodules文件提供了git clone的初始信息,但是.gitmodules文件是一个文件,因此在每次提交中都有一个副本。每次提交中的副本彼此不需要。也许提交 X 中的.gitmodules文件说要克隆github.com/repo1,但是提交 Y 中的.gitmodules文件说要克隆github.com / repo2。或者,也许某些提交完全缺少.gitmodules文件。

一个特别的问题是,Git将检测到其中有自己的.git存储库的子目录,而当您位于更高级别的Git存储库中时,git add只会添加该子目录,存储库作为gitlink条目。这不会创建一个.gitmodules文件。最终结果是,人们创建了一个仓库,这些仓库“想要”一个子模块,但是却根本没有提交任何.gitmodules文件。当克隆其中之一时,根本就没有获得Sub-Git。如果可以,那么也可以。 ?您可以在某些网络浏览器(例如GitHub的浏览器)上看到这些gitlink的小图标。 There are a lot of different icons for this.


1 Git文件名包含这样的嵌入式斜杠。这不是一个名为path的文件夹,其中没有一个包含gitlink的名为file的文件夹,而只是一个名为path/to/submodule的gitlink文件。这样做的原因必须与Git的 index 有关,我们在这里不再赘述。

2 通过将SHA-256引入Git的方式,我预见到这里会出现一些问题。我们可能需要一种新型的gitlink。