2014-02-19 153 views
3

我想构建一个方法,在该方法中我可以访问Github用户名,并发布所有提交或至少来自该用户的一些提交。Github API - 检索用户提交?

是否有一个调用来获取用户/回购/提交协会或直接用户/提交?

现在,我想这将是如下: 1.获取具有特定名称相关的回购 api.github.com/users/:name/repos

  1. 从饲料获得回购名称。

  2. 在阵列位置回购的名字,如:

    api.github.com/repos/:user/:repo1/commits api.github.com/repos/:user/:repo2/commits api.github.com/repos/:user/:repo3/commits

4.从饲料,获得的SHA数计数?

回答

2

也许其他人在以后对此感兴趣。

  1. 没有API来检索一个用户的所有提交 - >你必须自己做。

  2. 你描述它的方式很好,但是你错过了从2和4的所有提交,而不仅仅是那个用户。

Github的API,可以让你获得由作者提交的名单过滤https://developer.github.com/v3/repos/commits/#list-commits-on-a-repository

我的建议是做到以下几点:

  1. 检索用户的存储库,解析JSON响应并获取数组中的存储库名称。
    API链接 - api.github.com/users/:user/repos;替换为:用户与您想要的用户

  2. 对于每个存储库,获取由该用户创作的提交列表。

    API链接 - api.github.com/repos/:user/repositoryNameFromArray/commits?author=:user;用你想要的用户替换:用户,repositoryNameFromArray应该来自你的数组。

这里要小心,Github默认只检索最后30个提交。你需要使用分页来获得更大的块,最大为100.

你完成了。其余的由你决定,你想要对数据做什么。

3

迭代通过用户的存储库是次优的,因为它错过了他们在其他存储库中提交的任何提交。更好的方法是使用Events API

的第一步是get the user's events

GET /users/:username/events 

接下来,您需要通过返回的事件进行迭代,检查项目where result.type is set to PushEvent。其中每一个对应于用户的git push,并且该推送的提交可用(按照反向时间顺序)为result.payload.commits

您可以通过检查commit.author.email与您的预期匹配来过滤掉其他用户提交的任何提交。您还可以访问该对象上的shamessageurl等属性,并且可以使用distinct属性消除跨多次推送的重复提交。

整体而言,涉及的工作量更多,但它也能让您更准确地表达用户实际承诺的内容。

万一有帮助,这里的一些example code从我的网站,它使用上面的方法来获取最后一次提交的用户(使用Node.js的实施和octokat npm module)采取:

const USER = 'TODO: your GitHub user name' 
const EMAIL = 'TODO: your GitHub email address' 

const github = require('octokat')({ token: 'TODO: your GitHub API token' }) 

return github.fromUrl(`https://api.github.com/users/${USER}/events`) 
    .fetch() 
    .then(events => { 
    let lastCommit 

    events.some(event => { 
     return event.type === 'PushEvent' && event.payload.commits.reverse().some(commit => { 
     if (commit.author.email === EMAIL) { 
      lastCommit = { 
      repo: event.repo.name, 
      sha: commit.sha, 
      time: new Date(event.createdAt), 
      message: commit.message, 
      url: commit.url 
      } 

      return true 
     } 

     return false 
     }) 
    }) 

    return lastCommit 
    })