如何获取用户在Github上的所有公共提交记录

36

不管是哪个项目,我想知道获取单个用户名所有公共仓库提交记录的简单方法。

由于我属于多个组织,我试图编制一个列表,其中包括我是贡献者的项目以及我已接受拉取请求的项目。

到目前为止,我的Google搜索和查看GitHub API文档的尝试都没有成功。

6个回答

21

https://connectionrequired.com/gitspective是你的好帮手。 :-) 只需过滤掉除“Push”之外的所有内容,你就可以得到你想要的视图,尽管没有编写代码实现它的工作。

检查Chrome DevTools“Network”选项卡中发生的内容可能会帮助你模仿API查询,如果你想自己重新执行这项工作。


9
这并不是针对所有的贡献。它只显示了今年的所有贡献,而不是自2011年以来的全部贡献。 - Martin Seeler

11
正确的方法是通过Events API来实现。
首先,您需要获取用户的事件
GET /users/:username/events

然后,您需要过滤响应数组中的项目(其中type设置为PushEvent。每个这样的项目对应于用户的一个git push。该推送的提交以相反的时间顺序在payload.commits数组中可用。
下一步是通过检查每个提交对象的author.email属性来过滤其他用户所做的提交。您还可以在同一对象上访问诸如shamessageurl等属性,并使用distinct属性消除多个推送之间的重复提交。 编辑:正如Adam Taylor在评论中指出的那样,这种方法是错误的。我没有仔细阅读手册,很抱歉。API允许您获取最多300个事件,并且事件也限制在过去90天内。我会将答案保留在这里以保证完整性,但对于获取所有提交的声明问题,它不起作用。

好答案!可惜太晚了,否则它会成为顶尖的。 - theEpsilon
1
以下是来自此页面的一些重要说明:事件支持分页,但不支持per_page选项。固定页面大小为30个项目。支持获取最多十页,总共300个事件。只有在过去90天内创建的事件才会包含在时间轴中。超过90天的事件将不会包括在内(即使时间轴中的事件总数少于300)。 - Adam Taylor

5

更新 2018-11-12

下面提到的URL已经转移到一个单一的URL上,看起来像https://github.com/AurelienLourot?from=2018-10-09,但是想法仍然是一样的。请查看github-contribs


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

第一个挑战是列出用户曾经贡献过的所有 存储库。正如其他人指出的那样,官方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
...

5

GitGub GraphQL API v4中的ContributionsCollection对象按存储库分组提供了两个日期之间的贡献,最多可达100个存储库。 fromto最多相差一年,因此要检索所有贡献,您需要进行多个请求。

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

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.

2
这仅显示您所在组织以及您自己的存储库提交记录。它不显示您已提交但不属于您所在组织的开源存储库。 - user1130176

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接