32

无论项目如何,我都想知道是否有一种简单的方法可以为单个用户名获取所有公共存储库的所有提交。

由于我属于多个组织,因此我正在尝试编译我作为贡献者的项目列表,以及我已接受拉取请求的项目。

到目前为止,我的 google-fu 和查看 github api 文档已被证明是不够的。

4

6 回答 6

20

http://zmoazeni.github.com/gitspective/是你的朋友。:-) 过滤掉除“Push”之外的所有内容,你就有了自己的看法,尽管没有编码工作来首先自己实现它。

如果您想自己重做工作,检查 Chrome Devtools 的“网络”选项卡可能会帮助您模仿 API 查询。

于 2012-05-20T00:53:10.933 回答
11

正确的方法是通过事件 API

首先,您需要获取用户的事件

GET /users/:username/events

然后,您将要过滤设置为的项目typePushEvent响应数组。这些项目中的每一个都对应于git push用户。payload.commits来自该推送的提交在数组中按时间倒序提供。

下一步是通过检查author.email每个提交对象的属性来过滤掉其他用户的提交。您还可以访问同一对象上的 , 和 等属性shamessage并且可以使用该属性url消除多个推送中的重复提交。distinct

编辑:正如亚当泰勒在评论中指出的那样,这种方法是错误的。我未能进行 RTFM,抱歉。该 API 最多允许您获取 300 个事件,并且事件也仅限于过去 90 天。为了完整起见,我将在此处留下答案,但对于获取所有提交的所述问题,它不起作用。

于 2016-07-08T19:56:39.690 回答
5

更新 2018-11-12

下面提到的 URL 现在已移动到一个类似于https://github.com/AurelienLourot?from=2018-10-09的 URL,但想法保持不变。请参阅github-contribs


我想知道是否有一种简单的方法可以为单个用户名获取所有公共存储库的所有提交。

第一个挑战是列出用户曾经贡献过的所有repos。正如其他人指出的那样,官方API从一开始就不允许您获取此信息。

您仍然可以通过查询非官方页面并循环解析它们来获取该信息:

(免责声明:我是维护者。)

这正是github-contribs为您所做的:

$ sudo npm install -g @ghuser/github-contribs
$ github-contribs AurelienLourot
✔ Fetched first day at GitHub: 2015-04-04.
⚠ Be patient. The whole process might take up to an hour... Consider using --since and/or --until
✔ Fetched all commits and PRs.
35 repo(s) found:
AurelienLourot/lsankidb
reframejs/reframe
dracula/gitk
...
于 2018-06-12T08:47:49.520 回答
4

GitGub GraphQL API v4 ContributionsCollection对象提供在两个日期之间按存储库分组的贡献,最多 100 个存储库。from并且to最多可以相隔一年,因此要检索所有贡献,您需要提出多个请求。

query ContributionsView($username: String!, $from: DateTime!, $to: DateTime!) {
  user(login: $username) {
    contributionsCollection(from: $from, to: $to) {
      commitContributionsByRepository(maxRepositories: 100) {
        repository {
          nameWithOwner
        }
        contributions {
          totalCount
        }
      }
      pullRequestContributionsByRepository(maxRepositories: 100) {
        repository {
          nameWithOwner
        }
        contributions {
          totalCount
        }
      }
    }
  }
}
于 2019-07-21T08:31:07.837 回答
1

我知道这个问题已经很老了,但我最终编写了自己的解决方案。

最后,解决方案是找到用户使用organization_repositorieslist_repositories服务贡献的所有潜在存储库(我正在使用 octokit)。

然后我们branches在这些存储库上找到所有活动的分支(服务),并为每个分支找到来自我们用户(服务commits)的提交。

示例代码有点广泛,但可以在这里找到

OBS: As pointed out, this solution does not consider organizations and repositories where you contributed but are not part of.
于 2015-01-07T10:51:46.160 回答
0

您可以使用 API 方法获取有关用户的信息:get-a-single-user

之后,您可以找到所有用户存储库,然后使用如下功能提交:

def get_github_email(user_login, user_name, key):
    '''
    :param str user_login: user login for GitHub
    :param str key: your client_id + client_secret from GitHub, 
                string like '&client_id=your_id&client_secret=yoursecret'
    :param str user_name: user GitHub name (could be not equeal to user_login)
    :return: email (str or None) or False
    '''
    url = "https://api.github.com/users/{}/repos?{}".format(user_login, key)
    #get repositories
    reps_req = requests.get(url)

    for i in reps_req.json():
        if "fork" in i:
            # take only repositories created by user not forks
            if i["fork"] == False:
                commits_url = "https://api.github.com/repos/{}/{}/commits?{}".format(user_login, i["name"], key)
                #get commits
                commits_req = requests.get(commits_url)

                for j in commits_req.json():
                    #check if author is user (there may be commits from someone else)
                    if j.get("commit", {}).get("author", {}).get("name") == user_name:
                        return j["commit"]["author"]["email"]
    return False
于 2019-03-25T18:00:19.000 回答