通过 API 在 GitHub 存储库中查找最旧的提交

Mih*_*ita 6 github github-api

确定 GitHub 存储库中的初始提交何时进行的最有效方法是什么?存储库有一个created_at属性,但对于包含导入历史的存储库,最旧的提交可能要早得多。

当使用命令行时,这样的事情会起作用:

git rev-list --max-parents=0 HEAD

但是我在 GitHub API 中没有看到等效项。

Ber*_*tel 9

使用GraphQL API,有一种解决方法可以获取特定分支中最旧的提交(初始提交)。

首先获取最后一次提交并返回totalCountendCursor

{
  repository(name: "linux", owner: "torvalds") {
    ref(qualifiedName: "master") {
      target {
        ... on Commit {
          history(first: 1) {
            nodes {
              message
              committedDate
              authoredDate
              oid
              author {
                email
                name
              }
            }
            totalCount
            pageInfo {
              endCursor
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它返回类似于光标和pageInfo对象的内容:

"totalCount": 931886,
"pageInfo": {
  "endCursor": "b961f8dc8976c091180839f4483d67b7c2ca2578 0"
}
Run Code Online (Sandbox Code Playgroud)

我没有任何关于光标字符串格式的来源b961f8dc8976c091180839f4483d67b7c2ca2578 0,但我已经使用其他一些存储库进行了超过 1000 次提交的测试,并且它的格式似乎总是如下所示:

<static hash> <incremented_number>
Run Code Online (Sandbox Code Playgroud)

因此,您只需从totalCount(如果totalCount> 1)中减去 2 并获得最旧的提交(或初始提交,如果您愿意):

"totalCount": 931886,
"pageInfo": {
  "endCursor": "b961f8dc8976c091180839f4483d67b7c2ca2578 0"
}
Run Code Online (Sandbox Code Playgroud)

它给出以下输出(由 Linus Torvalds 初始提交):

<static hash> <incremented_number>
Run Code Online (Sandbox Code Playgroud)

中的一个简单实现使用此方法获得第一次提交:

{
  repository(name: "linux", owner: "torvalds") {
    ref(qualifiedName: "master") {
      target {
        ... on Commit {
          history(first: 1, after: "b961f8dc8976c091180839f4483d67b7c2ca2578 931884") {
            nodes {
              message
              committedDate
              authoredDate
              oid
              author {
                email
                name
              }
            }
            totalCount
            pageInfo {
              endCursor
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这篇文章中找到一个示例


Mih*_*ita 3

如果数据已经缓存(在 GitHub 一侧)并且根据您的精度要求,则只需两个请求即可完成此操作。

首先检查创建时间之前是否确实有提交,方法是将GET参数/repos/:owner/:repo/commits设置until为创建时间(如 VonC 的答案所建议)并将返回的数量限制为 1 次提交(通过参数per_page)。

如果在创建时间之前有提交,则可以调用贡献者统计端点( )。/repos/:owner/:repo/stats/contributors响应有weeks每个贡献者的列表,其中最旧的w值与最旧的提交在同一周。

如果您需要精确的时间戳,则可以再次使用提交列表端点并将untilsince设置为最旧周值之后 7 天的值。

请注意,统计端点可能会返回202表示统计信息不可用,在这种情况下需要在几秒钟内重试。