如何知道 Git 存储库在被克隆之前是否有子模块?
How to know if a Git repository has submodules before it is cloned?
是否有可能在我们克隆之前知道 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
上,该命令将打印其内容。我们可以检查其中是否列出了子模块。
一个子模块可以有自己的子模块。级别在理论上是不定式的。一个提交只记录它自己的子模块,不知道也不关心它的子模块是否有任何子模块。如果checked-out路径太长,可能会出现错误,这限制了实际水平。
这个问题没有完美的答案,因为子模块的存在很棘手。 , to check for a .gitmodules
file, is a good method for getting close enough for all practical purposes。我将在这里进入杂草部分。
这里的问题是子模块在 commit 中由 Git 在内部调用 gitlink[=58] 的实体表示=]. gitlink 包含路径名——Git 认为是文件名,例如 path/to/submodule
1——以及某些 Git 中某些提交的提交哈希 ID =76=] 存储库。2 这让我们可以更深入地探讨您的问题。
... and what their URL is?
这部分很棘手,因为子模块的 initial URL 必须来自某个地方,但是一旦子模块被 git clone
-ed, Git 不再关心 URL 是什么 。子模块现在只是一个 Git 存储库。
.gitmodules
文件提供 git clone
的初始信息,但 .gitmodules
文件是一个文件,因此在 中有它的副本每次提交。每个提交中的副本不需要彼此一致。也许提交 X 中的 .gitmodules
文件说要克隆 github.com/repo1 但提交 中的 .gitmodules
文件Y 表示要克隆 github.com/repo2。或者,也许某些提交完全缺少 .gitmodules
文件。
一个特别的问题是 Git 会检测到其中有自己的 .git
存储库的子目录,并且当您在更高级别的 Git 存储库中时,git add
将简单地将 sub-repository 添加为 gitlink 条目。这不会 创建 一个 .gitmodules
文件。最终结果是人们创建的存储库“想要”一个子模块,但在任何提交中都缺少 .gitmodules
文件。当您克隆其中之一时,您根本就不会得到 sub-Git。如果那没关系,好吧,那没关系。您可以在某些网络浏览器(例如 GitHub's)上看到这些 gitlinks 作为一个小图标。 There are a lot of different icons for this.
1Git 文件名包含这样的嵌入斜杠。这不是一个名为 path
的文件夹,其中包含一个名为 file
的文件夹,其中包含一个 gitlink,它只是一个名为 path/to/submodule
的 gitlink 文件。其原因与Git的index有关,此处不再赘述。
2通过将 SHA-256 引入 Git 的方式,我预见到这里会出现一些问题。我们可能需要一种新的 gitlink。
是否有可能在我们克隆之前知道 Git 存储库是否有子模块,如果有,它们是什么以及它们的 URL 是什么?
此外,子模块可以有自己的子模块吗?如果可以,Git 允许多少级层次结构?
Github 等托管服务提供 git 存储库浏览器。在浏览器中,我们可以看到特定提交的文件和文件夹。如果一个仓库有一个或多个子模块,它肯定有.gitmodules
。 .gitmodules
.
一些托管服务(不包括 Github)也允许 git archive --remote
下载特定文件。
git archive --remote=<url_to_repository> --format=zip master .gitmodules | gunzip -
如果 .gitmodules
存在于存储库的 master
上,该命令将打印其内容。我们可以检查其中是否列出了子模块。
一个子模块可以有自己的子模块。级别在理论上是不定式的。一个提交只记录它自己的子模块,不知道也不关心它的子模块是否有任何子模块。如果checked-out路径太长,可能会出现错误,这限制了实际水平。
这个问题没有完美的答案,因为子模块的存在很棘手。 .gitmodules
file, is a good method for getting close enough for all practical purposes。我将在这里进入杂草部分。
这里的问题是子模块在 commit 中由 Git 在内部调用 gitlink[=58] 的实体表示=]. gitlink 包含路径名——Git 认为是文件名,例如 path/to/submodule
1——以及某些 Git 中某些提交的提交哈希 ID =76=] 存储库。2 这让我们可以更深入地探讨您的问题。
... and what their URL is?
这部分很棘手,因为子模块的 initial URL 必须来自某个地方,但是一旦子模块被 git clone
-ed, Git 不再关心 URL 是什么 。子模块现在只是一个 Git 存储库。
.gitmodules
文件提供 git clone
的初始信息,但 .gitmodules
文件是一个文件,因此在 中有它的副本每次提交。每个提交中的副本不需要彼此一致。也许提交 X 中的 .gitmodules
文件说要克隆 github.com/repo1 但提交 中的 .gitmodules
文件Y 表示要克隆 github.com/repo2。或者,也许某些提交完全缺少 .gitmodules
文件。
一个特别的问题是 Git 会检测到其中有自己的 .git
存储库的子目录,并且当您在更高级别的 Git 存储库中时,git add
将简单地将 sub-repository 添加为 gitlink 条目。这不会 创建 一个 .gitmodules
文件。最终结果是人们创建的存储库“想要”一个子模块,但在任何提交中都缺少 .gitmodules
文件。当您克隆其中之一时,您根本就不会得到 sub-Git。如果那没关系,好吧,那没关系。您可以在某些网络浏览器(例如 GitHub's)上看到这些 gitlinks 作为一个小图标。 There are a lot of different icons for this.
1Git 文件名包含这样的嵌入斜杠。这不是一个名为 path
的文件夹,其中包含一个名为 file
的文件夹,其中包含一个 gitlink,它只是一个名为 path/to/submodule
的 gitlink 文件。其原因与Git的index有关,此处不再赘述。
2通过将 SHA-256 引入 Git 的方式,我预见到这里会出现一些问题。我们可能需要一种新的 gitlink。