Получите все имена файлов из репо GitHub через API GitHUB

Можно ли получить все имена файлов из репозитория с помощью API GitHub?

В настоящее время я пытаюсь исправить это, используя PyGithub, но я полностью согласен с ручным выполнением запроса как пока это работает.

Мой алгоритм пока такой:

  1. Получить имена пользовательских репозиториев
  2. Получить репозиторий пользователя, соответствующий определенному описанию
  3. ??? Получить имена файлов REPO?

person Anton Antonov    schedule 29.07.2014    source источник


Ответы (4)


Это должно относиться к конкретному коммиту, так как некоторые файлы могут присутствовать в одних коммитах и ​​отсутствовать в других, поэтому, прежде чем вы сможете просматривать файлы, вам нужно будет использовать что-то вроде Список обменивается в репозитории:

GET /repos/:owner/:repo/commits

Если вы просто заинтересованы в последнем филиале в филиале, вы можете установить параметр sha к имени ветви:

sha string SHA или ветвь, с которой начинается перечисление коммитов.

Получив хэш коммита, вы можете проверить этот коммит.

GET /repos/:owner/:repo/git/commits/:sha

Что должно вернуть что-то вроде этого (усеченное от документации GitHub):

{
  "sha": "...",
  "...",
  "tree": {
    "url": "https://api.github.com/repos/octocat/Hello-World/git/trees/691272480426f78a0138979dd3ce63b77f706feb",
    "sha": "691272480426f78a0138979dd3ce63b77f706feb"
  },
  "...": "..."
}

Посмотрите на хеш его дерева , что по сути, это содержимое каталога. В данном случае 691272480426f78a0138979dd3ce63b77f706feb. Теперь мы наконец можем запросить содержимое этого дерева:

GET /repos/:owner/:repo/git/trees/:sha

Выход из примера GitHub

{
  "sha": "9fb037999f264ba9a7fc6274d15fa3ae2ab98312",
  "url": "https://api.github.com/repos/octocat/Hello-World/trees/9fb037999f264ba9a7fc6274d15fa3ae2ab98312",
  "tree": [
    {
      "path": "file.rb",
      "mode": "100644",
      "type": "blob",
      "size": 30,
      "sha": "44b4fc6d56897b048c772eb4087f854f46256132",
      "url": "https://api.github.com/repos/octocat/Hello-World/git/blobs/44b4fc6d56897b048c772eb4087f854f46256132"
    },
    {
      "path": "subdir",
      "mode": "040000",
      "type": "tree",
      "sha": "f484d249c660418515fb01c2b9662073663c242e",
      "url": "https://api.github.com/repos/octocat/Hello-World/git/blobs/f484d249c660418515fb01c2b9662073663c242e"
    },
    {
      "path": "exec_file",
      "mode": "100755",
      "type": "blob",
      "size": 75,
      "sha": "45b983be36b73c0788dc9cbcb76cbb80fc7bb057",
      "url": "https://api.github.com/repos/octocat/Hello-World/git/blobs/45b983be36b73c0788dc9cbcb76cbb80fc7bb057"
    }
  ]
}

Как видите, у нас есть несколько BLOB-объектов, соответствующих файлам, и несколько дополнительных деревьев, соответствующих подкаталогам. Вы можете захотеть Делайте это рекурсивно.

person Chris    schedule 29.07.2014
comment
Также стоит обратить внимание на API содержимого репозитория. Он предоставляет знакомую структуру навигации в стиле каталогов, предоставляя дерево каталогов и файлов. - person jasonrudolph; 31.07.2014
comment
:sha можно пометить как master - person Peter Krauss; 31.08.2015

Вы можете использовать github git dreaks

https://api.github.com/repos/[USER]/[REPO]/git/trees/[BRANCH]?recursive=1

Репозиторий

http://github.com/deeja/bing-maps-loader

<сильный> API Call

https://api.github.com/repos/deeja/bing-maps-loader/git/trees/master?recursive=1

который возвращает

{
sha: "55382e87889ccb4c173bc99a42cc738358fc253a",
url: "https://api.github.com/repos/deeja/bing-maps-loader/git/trees/55382e87889ccb4c173bc99a42cc738358fc253a",
tree: [
{
path: "README.md",
mode: "100644",
type: "blob",
sha: "41ceefc1262bb80a25529342ee3ec2ec7add7063",
size: 3196,
url: "https://api.github.com/repos/deeja/bing-maps-loader/git/blobs/41ceefc1262bb80a25529342ee3ec2ec7add7063"
},
{
path: "index.js",
mode: "100644",
type: "blob",
sha: "a81c94f70d1ca2a0df02bae36eb2aa920c7fb20e",
size: 1581,
url: "https://api.github.com/repos/deeja/bing-maps-loader/git/blobs/a81c94f70d1ca2a0df02bae36eb2aa920c7fb20e"
},
{
path: "package.json",
mode: "100644",
type: "blob",
sha: "45f24dcb7a457b14fede4cb907e957600882b340",
size: 595,
url: "https://api.github.com/repos/deeja/bing-maps-loader/git/blobs/45f24dcb7a457b14fede4cb907e957600882b340"
}
],
truncated: false
}
person Dan    schedule 07.05.2020

Теперь с API-интерфейсом graphql стало намного проще, вы можете получить все это в одном запросе.

сначала вы получаете свое репо:

query {
  repository(name: "MyRepo" owner: "mylogin"){

  }
}

затем вы получаете его defaultBranchRef, чтобы упростить жизнь

    defaultBranchRef{

    }

Теперь вся ссылка на ветку на самом деле является просто указателем на фиксацию, и, поскольку graphql строго типизирован (а ссылки могут быть разными вещами), нам нужно сообщить ему, что это фиксация,

   target{
      ...on Commit {

      }
   }

Итак, цель — это то, на что указывает наша ссылка, и мы говорим: «Если это фиксация, сделайте это».

и что он должен делать? он должен получить самую последнюю фиксацию (поскольку в репозитории будут самые последние файлы)

поэтому для этого мы запрашиваем историю

        history(first: 1 until: "2019-10-08T00:00:00"){
            nodes{

            }
        }

теперь внутри nodes мы находимся внутри нашего коммита, и теперь мы можем видеть файлы, файлы в указателе коммитов на самом деле просто указатель на дерево, а дерево просто имеет записи, которые могут быть объектами типа Tree или введите блоб

записи, представляющие файлы, известны как BLOB-объекты, но, поскольку мы ничего с ними не делаем, а только перечисляем их имена, вам даже не нужно знать, что

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

       tree{
           entries {
             name
             object {
               ...on Tree{
                 entries{
                   name
                   object {
                      ...on Tree{
                        entries{
                          name
                        }
                      }
                   }
                 }
               }
             }
           } 
       }

теперь, чтобы собрать все это вместе:

query{
  repository(owner: "MyLogin", name: "MyRepo") {
    defaultBranchRef {
      target {
        ... on Commit {
          history(first: 1 until: "2019-10-08T00:00:00") {
            nodes {
              tree {
                entries {
                  name
                  object {
                    ... on Tree {
                      entries {
                        name
                        object{
                          ...on Tree{
                            entries{
                              name
                              object{
                                ...on Tree{
                                  entries{
                                    name
                                  }                                  
                                }
                              }
                            }   
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}
person Kyle Roux    schedule 08.10.2019

Как упомянул Дэн: деревья github

См. рабочий пример ниже

import requests

user = "grumbach"
repo = "ft_ping"

url = "https://api.github.com/repos/{}/{}/git/trees/master?recursive=1".format(user, repo)
r = requests.get(url)
res = r.json()

for file in res["tree"]:
    print(file["path"])

Для простоты я опустил управление ошибками, велоцирапторы и так вымерли…

person Anselme    schedule 25.05.2020