Github API:检索repo的所有分支的所有提交

时间:2012-02-07 16:21:34

标签: github-api

根据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}

问题在于,当我这样做时,它不会正确地分页结果。我觉得我们正在接近这个错误。有什么想法吗?

3 个答案:

答案 0 :(得分:35)

我遇到了完全相同的问题。我确实设法获取了存储库中所有分支的所有提交(由于API,可能不是高效)。

检索存储库中所有分支的所有提交的方法

如你所说,首先你收集所有分支:

# https://api.github.com/repos/:user/:repo/branches
https://api.github.com/repos/twitter/bootstrap/branches

您缺少的关键是用于获取提交的APIv3使用引用提交(用于对列表提交的API调用的参数 sha )进行操作。因此,你需要确保当你收集分支时,你也会收集他们最新的sha:

对twitter / bootstrap

的分支API调用的修剪结果
[
  {
    "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。你现在可以做的是从他们最新的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)

没有访问令牌的纯JS实现(未经授权的使用)

var

信用-https://gist.github.com/yershalom/a7c08f9441d1aadb13777bce4c7cdc3b