TL;博士
如问题中所述,如果您在.gitmodules找到的子模块路径中获取内容,您将获得一条“子模块”类型的内容。这有空内容。
但是,如果您获得了相同子模块路径的父目录的内容,您将获得一段“文件”类型的内容,其中包含您的子模块的路径(例如,path/to/submodule
上面)。此文件哈希是子模块自己的存储库上的目标 SHA。
细节
要获取子模块的 SHA,您需要获取其父目录的内容,然后索引到表示子模块的文件。虽然直接进入路径会为您提供“子模块”类型的内容,但获取父内容将为您提供一堆“文件”类型的内容(以及“目录”,如果您在那里有兄弟子目录)。奇怪的是,这个父内容列表不包括直接指向子模块路径时获得的“子模块”类型。
在上面的示例中,只需在路径中上一层即可。
var submodulePathContents = await repositoriesClient.Content.GetAllContents(parentRepoId, "path/to"); // no longer "path/to/submodule"
从那里,首先获取具有您想要的路径的内容项(例如,“path/to/submodule”),该路径将Sha
在子模块存储库中包含一个包含子模块目标 SHA 的字段。
using System.Linq;
…
var submoduleTargetSha = submodulePathContents.First(content => content.Path == submodulePath).Sha;
这是来自monodevelop repo 的主要子模块目录的示例条目。
Name: mono-tools Path: main/external/mono-tools Type:File Octokit.RepositoryContent
Content null string
DownloadUrl null System.Uri
EncodedContent null string
Encoding null string
GitUrl {https://api.github.com/repos/mono/mono-tools/git/trees/d858f5f27fa8b10d734ccce7ffba631b995093e5} System.Uri
HtmlUrl {https://github.com/mono/mono-tools/tree/d858f5f27fa8b10d734ccce7ffba631b995093e5} System.Uri
Name "mono-tools" string
Path "main/external/mono-tools" string
Sha "d858f5f27fa8b10d734ccce7ffba631b995093e5" string
Size 0 int
SubmoduleGitUrl null System.Uri
Target null string
Type File Octokit.ContentType
Url {https://api.github.com/repos/mono/monodevelop/contents/main/external/mono-tools?ref=master} System.Uri
该哈希值与 Web UI 一致。