迭代用户的存储库并不是最佳选择,因为它会错过他们在其他存储库中所做的任何提交。更好的方法是使用事件API https://developer.github.com/v3/activity/events/反而。
第一步是获取用户的事件 https://developer.github.com/v3/activity/events/#list-events-performed-by-a-user:
GET /users/:username/events
接下来,您需要迭代返回的事件,检查项目where result.type被设定为PushEvent https://developer.github.com/v3/activity/events/types/#pushevent。其中每一项都对应一个git push
由用户和该推送的提交可用(按时间倒序排列)为result.payload.commits
.
您可以通过检查来过滤这些内容以忽略其他用户所做的任何提交commit.author.email
符合您的期望。您还可以访问以下属性sha
, message
and url
在该对象上,您可以使用以下方法消除多次推送中的重复提交distinct
财产。
总体而言,涉及更多的跑腿工作,但它也可以让您更准确地了解用户实际提交的内容。
如果有帮助,这里有一些示例代码 https://gitlab.com/philbooth/www/blob/9067593eee0788f48cd32a32292562a39f7d0a91/server/data/code.js#L313-333取自我的网站,它使用上述方法来获取用户的最后一次提交(使用 Node.js 和octokatnpm 模块 https://www.npmjs.com/package/octokat):
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
})