简体   繁体   中英

How to get all of a user's public github commits

Regardless of project, I'd like to know if there's an easy way of getting all commits to all public repositories for a single username.

Since I belong to multiple organizations, I'm trying to compile a list of the projects on which I'm a contributor, as well as projects that I have accepted pull requests.

So far my google-fu and looking through the github api docs has proved insufficient.

http://zmoazeni.github.com/gitspective/ is your friend. :-) Filter out all but "Push", and you have your view, albeit without the coding work to implement it yourself first.

Inspecting what goes on with the Chrome Devtools "Network" tab might help you mimic the API queries, if you want to redo the work yourself.

The correct way to do this is via the Events API .

First you need to fetch the user's events :

GET /users/:username/events

Then you will want to filter the response array for items where type is set to PushEvent . Each one of these items corresponds to a git push by the user. The commits from that push are available in reverse chronological order in the payload.commits array.

The next step is to filter out commits made by other users by checking the author.email property of each commit object. You also have access to properties like sha , message and url on the same object, and you can eliminate duplicate commits across multiple pushes by using the distinct property.

EDIT: As pointed out by Adam Taylor in the comments, this approach is wrong. I failed to RTFM, sorry. The API lets you fetch at most 300 events and events are also limited to the last 90 days. I'll leave the answer here for completeness but for the stated question of fetching all commits, it won't work.

UPDATE 2018-11-12

The URLs mentioned below have now moved to a single URL that looks like https://github.com/AurelienLourot?from=2018-10-09 but the idea remains the same. See github-contribs .


I'd like to know if there's an easy way of getting all commits to all public repositories for a single username.

The first challenge is to list all repos a user has ever contributed to. As pointed out by others, the official API won't allow you to get this information since the beginning of time .

Still you can get that information by querying unofficial pages and parsing them in a loop:

(Disclaimer: I'm the maintainer.)

This is exactly what github-contribs does for you:

$ 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
...

I know this question is quite old, but I've ended up coding my own solution to this.

In the end the solution is to find all potential repositories where the user contributed using the organization_repositories and list_repositories services (I'm using octokit).

Then we find all active branches (service branches ) on these repositories and for each of them find only the commits from our user (service commits ).

The sample code is a little bit extensive, but can be found here

OBS: As pointed out, this solution does not consider organizations and repositories where you contributed but are not part of.

You can get info about the user using the API method: get-a-single-user

After that you can find all user repositories and then commits with function like that:

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

The GitGub GraphQL API v4 ContributionsCollection object provides contributions grouped by repository between two dates, up to a maximum of 100 repositories. from and to can be a maximum of one year apart, so to retrieve all contributions you will need to make multiple requests.

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM