Список веток, в которых появляется коммит

Используя GitHub API (v3), я бы хотел выяснить, на каких ветвях появляется коммит. Я не нашел способа напрямую запросить это ни с помощью коммитов репо, ни с помощью объектов данных коммитов. Альтернативным решением было бы перечислить все ветви и сравнить с их заголовком; Я думаю, что сравнение не удастся, если фиксация не на данной ветви.

Это поддерживается через текущий API, и я просто пропустил это? Если нет, есть ли у вас (лучше) обходной путь?

5 ответов

Решение

Это невозможно напрямую через API GitHub.

Обходной путь 1:

  1. получить список всех филиалов
  2. для каждой ветви получите список коммитов в этой ветви
  3. проверить, есть ли коммит в списке коммитов для каждой ветви

Обходной путь 2 (думаю, это сработает, но не уверен на 100%, пропустил ли я дело):

  1. получить список всех филиалов
  2. для каждой ветви сравните ветку с SHA:

    https://api.github.com/repos/:user/:repo/compare/:branch...:sha_of_commit

  3. Если значение status атрибут в ответе diverged или же ahead, то фиксация не в ветке. Если значение status атрибут behind или же identical, то коммит находится в ветке.

Я не проверял, поддерживается ли это напрямую GitHub API, но это тривиально, используя простой Git:

git branch --all --contains <commit>

Это перечислит все ветви (локальные и удаленные) в локальном репозитории, которые содержат данный коммит.

Если кто-то использует библиотеку PyGitHub (https://pygithub.readthedocs.io/en/latest/introduction.html) для вызовов API -

Сначала получите список всех ветвей, а затем

      g = Github(<accesskey>)
repo = g.get_repo(<repository>)
is_commit_in_branch = repo.compare('stable-2.11', <commit_id>).status
# If it returns behind or identical, then the commit is in the branch.

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

Условие 1. Используйте конечную точку branch-where-head, чтобы получить имена ветвей, в которых данный идентификатор фиксации является головным.

Условие 2. Если условие 1 возвращает пустое значение, получите информационный объект извлечения, используя идентификатор фиксации, и извлеките информацию о ветке, используя конечную точку информации извлечения . Совет: возвращаемый объект содержит свойства - base.ref и head.ref, которые имеют имя ветки. Если base.ref — это имя главной ветки, используйте head.ref, который должен дать вам имя ветки, содержащей идентификатор фиксации.

Git Lab API

Следуя решению Ивана Зузака № 2, узнайте, есть ли коммит в ветке:

Используйте API сравнения репозитория GitLab и сравните данные из ветки с коммитом

GET /projects/:id/repository/compare?from=<branch>&to=<sha_of_commit>

Если commits список пуст, тогда да, коммит находится на этой ветке.

В Python, используя python-gitlab:

def is_commit_on_branch(project, commit, branch):
    c = project.repository_compare(branch, commit)
    return not c['commits']
Другие вопросы по тегам