3

有什么方法可以通过 Octokit[.net] 查看 GitHub 存储库子模块的当前目标 SHA(无需在本地克隆)?

我已经能够通过从“父”存储库中检索.gitmodules文件来跟踪所有子模块,但是该文件不维护子模块在该子模块存储库中指向的位置。

先前的尝试

在找到有人通过使用 LibGit2Sharp 通过子模块路径索引提交来获取此信息后,我在 Octokit 中进行了类似的尝试。

var submodulePathContents = await repositoriesClient.Content.GetAllContents(parentRepoId, "path/to/submodule");

在调试器中单步执行此代码时,我在 Locals/Autos 中看到了这一点,因此它肯定知道我将其指向子模块路径。

System.Collections.Generic.IReadOnlyList.this[int].get 名称:mono-tools 路径:path/to/submodule 类型:子模块 Octokit.RepositoryContent

不幸的是,当我从该列表中获取实际内容时,submodulePathContents[0].Content只是null.

当您导航到子模块的父目录时,GitHub Web 界面肯定会显示此信息,所以这让我觉得我只是尝试了错误的方法。

GitHub 在 Web 界面中显示子模块的目标哈希。

Octokit API 中是否还有其他神奇的方式让我错过了获取此子模块目标哈希的方法?

4

1 回答 1

3

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 一致。

在此处输入图像描述

于 2017-07-28T20:49:39.093 回答