确定 GitHub 存储库中的初始提交何时进行的最有效方法是什么?存储库有一个created_at属性,但对于包含导入历史的存储库,最旧的提交可能要早得多。
当使用命令行时,这样的事情会起作用:
git rev-list --max-parents=0 HEAD
但是我在 GitHub API 中没有看到等效项。
使用GraphQL API,有一种解决方法可以获取特定分支中最旧的提交(初始提交)。
首先获取最后一次提交并返回totalCount和endCursor:
{
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)
python中的一个简单实现使用此方法获得第一次提交:
{
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)
你可以在这篇文章中找到一个javascript示例
如果数据已经缓存(在 GitHub 一侧)并且根据您的精度要求,则只需两个请求即可完成此操作。
首先检查创建时间之前是否确实有提交,方法是将GET参数/repos/:owner/:repo/commits设置until为创建时间(如 VonC 的答案所建议)并将返回的数量限制为 1 次提交(通过参数per_page)。
如果在创建时间之前有提交,则可以调用贡献者统计端点( )。/repos/:owner/:repo/stats/contributors响应有weeks每个贡献者的列表,其中最旧的w值与最旧的提交在同一周。
如果您需要精确的时间戳,则可以再次使用提交列表端点并将until其since设置为最旧周值之后 7 天的值。
请注意,统计端点可能会返回202表示统计信息不可用,在这种情况下需要在几秒钟内重试。
| 归档时间: |
|
| 查看次数: |
3712 次 |
| 最近记录: |