使用GraphQL API,有一种解决方法可以在特定分支中获取最旧的提交(初始提交)。
首先获取last commit并返回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
}
}
}
}
}
}
}
它为光标和pageInfo 对象返回类似的内容:
"totalCount": 931886,
"pageInfo": {
"endCursor": "b961f8dc8976c091180839f4483d67b7c2ca2578 0"
}
我没有关于光标字符串格式 b961f8dc8976c091180839f4483d67b7c2ca2578 0 的任何来源,但我已经使用其他一些提交超过 1000 次的存储库进行了测试,它似乎总是格式化为:
<static hash> <incremented_number>
因此,您只需从 totalCount 中减去 2(如果 totalCount 大于 1)并获得最旧的提交(如果您愿意,也可以是初始提交):
{
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
}
}
}
}
}
}
}
给出以下输出(Linus Torvalds 的初始提交):
{
"data": {
"repository": {
"ref": {
"target": {
"history": {
"nodes": [
{
"message": "Linux-2.6.12-rc2\n\nInitial git repository build. I'm not bothering with the full history,\neven though we have it. We can create a separate \"historical\" git\narchive of that later if we want to, and in the meantime it's about\n3.2GB when imported into git - space that would just make the early\ngit days unnecessarily complicated, when we don't have a lot of good\ninfrastructure for it.\n\nLet it rip!",
"committedDate": "2005-04-16T22:20:36Z",
"authoredDate": "2005-04-16T22:20:36Z",
"oid": "1da177e4c3f41524e886b7f1b8a0c1fc7321cac2",
"author": {
"email": "torvalds@ppc970.osdl.org",
"name": "Linus Torvalds"
}
}
],
"totalCount": 931886,
"pageInfo": {
"endCursor": "b961f8dc8976c091180839f4483d67b7c2ca2578 931885"
}
}
}
}
}
}
}
python 中的一个简单实现,使用此方法获得第一次提交:
import requests
token = "YOUR_TOKEN"
name = "linux"
owner = "torvalds"
branch = "master"
query = """
query ($name: String!, $owner: String!, $branch: String!){
repository(name: $name, owner: $owner) {
ref(qualifiedName: $branch) {
target {
... on Commit {
history(first: 1, after: %s) {
nodes {
message
committedDate
authoredDate
oid
author {
email
name
}
}
totalCount
pageInfo {
endCursor
}
}
}
}
}
}
}
"""
def getHistory(cursor):
r = requests.post("https://api.github.com/graphql",
headers = {
"Authorization": f"Bearer {token}"
},
json = {
"query": query % cursor,
"variables": {
"name": name,
"owner": owner,
"branch": branch
}
})
return r.json()["data"]["repository"]["ref"]["target"]["history"]
#in the first request, cursor is null
history = getHistory("null")
totalCount = history["totalCount"]
if (totalCount > 1):
cursor = history["pageInfo"]["endCursor"].split(" ")
cursor[1] = str(totalCount - 2)
history = getHistory(f"\"{' '.join(cursor)}\"")
print(history["nodes"][0])
else:
print("got oldest commit (initial commit)")
print(history["nodes"][0])
您可以在this postjavascript 中找到示例