Как заставить всех пользователей публиковать github
Независимо от проекта, я хотел бы знать, есть ли простой способ получить все коммиты для всех публичных репозиториев для одного имени пользователя.
Поскольку я принадлежу к нескольким организациям, я пытаюсь скомпилировать список проектов, на которых я являюсь автором, а также проекты, которые я принял запросы на загрузку.
До сих пор мой google-fu и просмотр github api docs оказался недостаточным.
Ответы
Ответ 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
}
}
}
}
}