GitHub API - получить количество веток репо, не перечисляя все его ветки

Сейчас я пишу небольшой проект с использованием GitHub API v3.

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

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

  1. Создайте организацию. например GET https://api.github.com/orgs/cloudify-cosmo, используя правильные учетные данные для аутентификации GitHub.
  2. Предполагая, что аутентификация прошла успешно, в теле ответа есть два поля с именами public_repos и total_private_repos.
  3. Чтобы получить количество репозиториев, просто сложите значения этих двух полей.

Итак, я что-то упускаю? Есть ли такой же удобный способ (или вообще какой-либо способ) получить количество ветвей репо без необходимости перечислять его ветки?


person Avia Efrat    schedule 20.10.2015    source источник
comment
GET /repos/:owner/:repo/branches возвращает массив, нельзя ли просто использовать его длину?   -  person jaredready    schedule 20.10.2015
comment
Я могу это сделать, но это, как я указал, требует от меня перечисления всех ветвей этого репо. Я хотел бы получить количество веток без необходимости запрашивать информацию exrta, точно так же, как получение количества репозиториев на организацию, используя только поля GET /orgs/:org, без необходимости иметь дело с запросом репо, например GET /orgs/:org/repos   -  person Avia Efrat    schedule 20.10.2015


Ответы (3)


В настоящее время такого атрибута нет.

Однако есть хитрый прием, который позволяет избежать загрузки всех страниц. Если вы установите per_page на 1, тогда каждая страница будет содержать 1 элемент, и количество страниц (показанных последней страницей) также сообщит вам общее количество элементов:

https://developer.github.com/v3/#pagination

Итак, всего одним запросом - вы можете получить общее количество веток. Например, если вы получите этот URL и проверите заголовок ссылки:

https://api.github.com/repos/github/linguist/branches?per_page=1

то вы заметите, что заголовок Link:

Link: <https://api.github.com/repositories/1725199/branches?per_page=1&page=2>; rel="next", <https://api.github.com/repositories/1725199/branches?per_page=1&page=28>; rel="last"

Это говорит о том, что есть 28 страниц результатов, и поскольку на каждой странице есть один элемент, общее количество ветвей составляет 28.

Надеюсь это поможет.

person Ivan Zuzak    schedule 21.10.2015

Вы также можете использовать GraphQL API v4, чтобы легко получить количество ветвей:

{
  repository(owner: "google", name: "gson") {
    refs(first: 0, refPrefix: "refs/heads/") {
      totalCount
    }
  }
}

Попробуйте в проводнике

который дает :

{
  "data": {
    "repository": {
      "refs": {
        "totalCount": 13
      }
    }
  }
}

Поскольку вы делаете это в нескольких репозиториях, с GraphQL это также проще, поскольку вы можете создавать запросы с разными псевдонимы для каждого репо и используйте только один запрос, чтобы получить количество веток для всех из них:

{
  fetch: repository(owner: "github", name: "fetch") {
    ...RepoFragment
  }
  hub: repository(owner: "github", name: "hub") {
    ...RepoFragment
  }
  scientist: repository(owner: "github", name: "scientist") {
    ...RepoFragment
  }
}

fragment RepoFragment on Repository {
  refs(first: 0, refPrefix: "refs/heads/") {
    totalCount
  }
}

Попробуйте в проводнике

person Bertrand Martel    schedule 27.11.2017
comment
У меня были проблемы с этим запросом в частном репо, пока я не предоставил своему личному токену доступа полный доступ к репо. Если вы получили счетчик 0 и у вас есть ветки, проверьте ваши разрешения - person TheLukeMcCarthy; 15.02.2021

Я создал простую утилиту Power Shell на основе ответа Avia. Надеюсь, это поможет кому-то в будущем. Хотя он написан в Powershel, его можно использовать и на любом другом языке.


#$response = Invoke-WebRequest  -Uri https://api.github.com/repos/github/linguist/branches?per_page=1

$response = Invoke-WebRequest  -Uri https://api.github.com/repos/angular/angular/branches?per_page=1

#https://github.com/angular/angular

$numberOfBranchesString = $response.Headers.link.Split(";")[1].Split(",")[1].Split("&")[1].Split("=")[1];

$numberOfBranches = $numberOfBranchesString.Substring(0, $numberOfBranchesString.length-1);

$numBranch = $numberOfBranches -as [int];

$loopToRunBranch = $numBranch/10 + 1


$remainingBranches = $numBranch%10;

for($i=0; $i -lt $loopToRunBranch; $i++) {
    
    if($i -lt $loopToRunBranch -1 ) {
    #    $response = Invoke-WebRequest  -Uri "https://api.github.com/repos/github/linguist/branches?per_page=10"
        $response = Invoke-WebRequest  -Uri "https://api.github.com/repos/angular/angular/branches?page=$($i+1)&per_page=10"
    
        echo $response
    }
    else {
        $remainingBranches = $numberOfBranches%10
    #    $response = Invoke-WebRequest  -Uri "https://api.github.com/repos/github/linguist/branches?per_page=$remainingBranches"
        $response = Invoke-WebRequest  -Uri "https://api.github.com/repos/angular/angular/branches?page=$($i+1)&per_page=$remainingBranches"
    
        echo "$i from Else $response"
    }

}```
person AWKASH AGRAWAL    schedule 30.07.2020