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

通过API在GitHub存储库中查找最早的提交,github,github-api,python,javascript,Github,Github Api,Python,Javascript,确定GitHub存储库中的初始提交是何时进行的最有效的方法是什么?存储库有一个在处创建的属性,但是对于包含导入历史的存储库,最早的提交可能要老得多 使用命令行时,类似这样的操作将起作用: git版本列表--最大父项=0头 但是,我在GitHub API中没有看到类似的功能。一个建议是,使用until参数,将repo的创建设置为(例如,加上一天),在repo上列出提交(请参见) 这样,您将列出在创建repo时或之前创建的所有提交:这将限制列表,不包括创建repo后创建的所有提交。如果数据已经缓存(

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

使用命令行时,类似这样的操作将起作用:

git版本列表--最大父项=0头


但是,我在GitHub API中没有看到类似的功能。

一个建议是,使用
until
参数,将repo的创建设置为(例如,加上一天),在repo上列出提交(请参见)


这样,您将列出在创建repo时或之前创建的所有提交:这将限制列表,不包括创建repo后创建的所有提交。

如果数据已经缓存(在GitHub一侧),并且取决于您的精度要求,这可以在两个请求中完成

首先检查在创建时间之前是否确实有提交,方法是对
/repos/:owner/:repo/commits
执行
GET
,将
直到
参数设置为创建时间(根据VonC的回答建议),并将返回的数量限制为1次提交(通过
每页
参数)

如果在创建时间之前有提交,则可以调用(
/repos/:owner/:repo/stats/contributors
)。每个参与者的响应都有一个
weeks
列表,其中最早的
w
值与最早的提交时间相同

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


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

在页码上尝试并出错


git历史记录,例如使用gitk,可以帮助您提高试错效率。

这不是通过API,而是在GitHub.com上:如果您有最新的提交SHA和提交计数,您可以构建URL来查找它:

https://github.com/USER/REPO/commits?after=LAST_COMMIT_SHA+提交计数减去2
#例如。本例中的提交计数为1573
https://github.com/sindresorhus/refined-github/commits/master
?之后=A76ED868A84CD0078D842399FAABA7380B0DF1B+1571
使用,可以在特定分支中获得最早的提交(初始提交)

首先获取并返回
totalCount
endCursor

{
存储库(名称:“linux”,所有者:“torvalds”){
参考号(合格名称:“主控”){
目标{
…提交{
历史(第一:1){
节点{
消息
委员会
创作日期
老年人
作者{
电子邮件
名称
}
}
总数
页面信息{
结束光标
}
}
}
}
}
}
}
它返回与光标和
pageInfo
对象类似的内容:

"totalCount": 931886,
"pageInfo": {
  "endCursor": "b961f8dc8976c091180839f4483d67b7c2ca2578 0"
}
我没有关于游标字符串格式的任何源代码
b961f8dc8976c091180839f4483d67b7c2ca2578 0
,但我已经使用其他存储库测试了1000多次提交,它的格式似乎总是这样:

<static hash> <incremented_number>
这将给出以下输出(Linus Torvalds的初始提交):

{
“数据”:{
“存储库”:{
“参考”:{
“目标”:{
“历史”:{
“节点”:[
{
“消息”:“Linux-2.6.12-rc2\n\n初始git存储库构建。尽管我们有完整的历史记录,\n但我并不在意它。我们可以创建一个单独的\”历史记录\“git\n如果我们愿意的话,我们可以稍后再使用它,同时当它被导入git-space时大约是\n3.2GB,这只会使早期的it变得不必要的复杂,因为我们没有很多好的\n基础结构。\n\n让它rip!”,
“委员会”:“2005-04-16T22:20:36Z”,
“authoredDate”:“2005-04-16T22:20:36Z”,
“oid”:“1da177e4c3f41524e886b7f1b8a0c1fc7321cac2”,
“作者”:{
“电子邮件”:torvalds@ppc970.osdl.org",
“名称”:“Linus Torvalds”
}
}
],
“总数”:931886,
“页面信息”:{
“结束光标”:“b961f8dc8976c091180839f4483d67b7c2ca2578 931885”
}
}
}
}
}
}
}
中的一个简单实现使用此方法获取第一次提交:

导入请求
token=“您的令牌”
name=“linux”
owner=“torvalds”
branch=“master”
query=”“”
查询($name:String!,$owner:String!,$branch:String!){
存储库(名称:$name,所有者:$owner){
ref(合格名称:$branch){
目标{
…提交{
历史记录(第一个:1,之后:%s){
节点{
消息
委员会
创作日期
老年人
作者{
电子邮件
名称
}
}
总数
页面信息{
结束光标
}
}
}
}
}
}
}
"""
def getHistory(光标):
r=请求。post(“https://api.github.com/graphql",
标题={
“授权”:f“承载{令牌}”
},
json={
“查询”:查询%光标,
“变量”:{
“姓名”:姓名,
“所有者”:所有者,
“分行”:分行
}
})
返回r.json()
#在第一个请求中,游标为null
history=getHistory(“null”)
总数
<static hash> <incremented_number>