Подтвердить что ты не робот

Как заставить всех пользователей публиковать github

Независимо от проекта, я хотел бы знать, есть ли простой способ получить все коммиты для всех публичных репозиториев для одного имени пользователя.

Поскольку я принадлежу к нескольким организациям, я пытаюсь скомпилировать список проектов, на которых я являюсь автором, а также проекты, которые я принял запросы на загрузку.

До сих пор мой google-fu и просмотр github api docs оказался недостаточным.

4b9b3361

Ответ 1

http://zmoazeni.github.com/gitspective/ - ваш друг.:-) Отфильтруйте все, кроме "Push", и у вас есть свой взгляд, хотя без выполнения кодирования его реализовать сначала.

Проверка того, что происходит с вкладкой "Сеть" Chrome Devtools, может помочь вам подражать запросам API, если вы хотите переделать работу самостоятельно.

Ответ 2

Правильный способ сделать это через API событий.

Сначала вам нужно извлечь пользовательские события:

GET /users/:username/events

Затем вам нужно будет отфильтровать массив ответов для элементов где type установлен на PushEvent. Каждый из этих элементов соответствует пользователю git push. Конец этого нажатия доступен в обратном хронологическом порядке в массиве payload.commits.

Следующий шаг - отфильтровать коммиты, сделанные другими пользователями, путем проверки свойства author.email каждого объекта фиксации. У вас также есть доступ к таким свойствам, как sha, message и url на одном и том же объекте, и вы можете устранить повторяющиеся фиксации для нескольких нажатий, используя свойство distinct.

EDIT: Как отмечалось в комментариях Adam Taylor, этот подход неверен. Извините, мне не удалось RTFM. API позволяет получать не более 300 событий, а события также ограничены последними 90 днями. Я остану здесь ответ на полноту, но по заявленному вопросу о получении всех коммитов это не сработает.

Ответ 3

ОБНОВЛЕНИЕ 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
...

Ответ 4

Я знаю, что этот вопрос довольно старый, но я в конечном итоге кодировал свое собственное решение.

В конечном итоге решение состоит в том, чтобы найти все потенциальные хранилища, в которые пользователь внес вклад, используя службы organization_repositories и list_repositories (я использую октокит).

Затем мы находим все активные ветки (service branches) в этих репозиториях и для каждого из них обнаруживаем только коммиты от нашего пользователя (service commits).

Пример кода немного широк, но можно найти здесь

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

Ответ 5

Вы можете получить информацию о пользователе, используя метод 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

Ответ 6

Объект 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
        }
      }
    }
  }
}