根据V2文档,您可以列出分支的所有提交:
commits/list/:user_id/:repository/:branch
我没有在V3文档中看到相同的功能。
我想使用以下内容收集所有分支:
https://api.github.com/repos/:user/:repo/branches
然后遍历它们,为每个提交所有提交。或者,如果有一种方法可以直接为所有分支提取所有分支,那么即使不是更好也可以。有任何想法吗?
更新:我尝试传递分支:sha作为参数,如下所示:
params = {:page => 1, :per_page => 100, :sha => b}
问题在于,当我这样做时,它不会正确地分页结果。我觉得我们正在接近这个错误。有什么想法吗?
答案 0 :(得分:35)
我遇到了完全相同的问题。我确实设法获取了存储库中所有分支的所有提交(由于API,可能不是高效)。
如你所说,首先你收集所有分支:
# https://api.github.com/repos/:user/:repo/branches
https://api.github.com/repos/twitter/bootstrap/branches
您缺少的关键是用于获取提交的APIv3使用引用提交(用于对列表提交的API调用的参数 sha )进行操作。因此,你需要确保当你收集分支时,你也会收集他们最新的sha:
[
{
"commit": {
"url": "https://api.github.com/repos/twitter/bootstrap/commits/8b19016c3bec59acb74d95a50efce70af2117382",
"sha": "8b19016c3bec59acb74d95a50efce70af2117382"
},
"name": "gh-pages"
},
{
"commit": {
"url": "https://api.github.com/repos/twitter/bootstrap/commits/d335adf644b213a5ebc9cee3f37f781ad55194ef",
"sha": "d335adf644b213a5ebc9cee3f37f781ad55194ef"
},
"name": "master"
}
]
因为我们看到这里的两个分支有不同的sha,这些是这些分支上的最新提交sha。你现在可以做的是从他们最新的sha:
遍历每个分支# With sha parameter of the branch's lastest sha
# https://api.github.com/repos/:user/:repo/commits
https://api.github.com/repos/twitter/bootstrap/commits?per_page=100&sha=d335adf644b213a5ebc9cee3f37f781ad55194ef
因此,上面的API调用将列出 twitter / bootstrap 的主分支的最后100个提交。使用API,您必须指定下一个提交的sha以获得接下来的100次提交。我们可以使用最后一次提交的sha(使用当前示例 7a8d6b19767a92b1c4ea45d88d4eedc2b29bf1fa )作为下一个API调用的输入:
# Next API call for commits (use the last commit's sha)
# https://api.github.com/repos/:user/:repo/commits
https://api.github.com/repos/twitter/bootstrap/commits?per_page=100&sha=7a8d6b19767a92b1c4ea45d88d4eedc2b29bf1fa
重复此过程,直到最后一次提交的sha与API的call sha参数相同。
这是一个分支。现在,您对其他分支应用相同的方法(从最新的sha开始工作)。
这种方法存在一个很大的问题...由于分支共享一些相同的提交,因此当您移动到另一个分支时,您将会再次看到相同的提交。
我可以想象有一种更有效的方法来实现这一点,但这对我有用。
答案 1 :(得分:20)
我对GitHub的支持问了同样的问题,他们回答了我:
GETing /repos/:owner/:repo/commits应该做到这一点。您可以在
sha
参数中传递分支名称。例如,要从' 3.0.0-wip'获取提交的第一页。 the twitter/bootstrap repository的分支,您将使用以下curl请求:curl https://api.github.com/repos/twitter/bootstrap/commits?sha=3.0.0-wip
该分支的文档describe how to use pagination to get the remaining commits。
只要您making authenticated requests,就可以up to 5,000 requests per hour。
我在我的应用程序中使用了rails github-api,如下所示(使用https://github.com/peter-murach/github gem):
github_connection = Github.new :client_id => 'your_id', :client_secret => 'your_secret', :oauth_token => 'your_oath_token'
branches_info = {}
all_branches = git_connection.repos.list_branches owner,repo_name
all_branches.body.each do |branch|
branches_info["#{branch.name}".to_s] = "#{branch.commit.url}"
end
branches_info.keys.each do |branch|
commits_list.push (git_connection.repos.commits.list owner,repo_name, start_date, end_date, :sha => "branch_name")
end
答案 2 :(得分:0)