Pygithub: Mendownload file besar

Dibuat pada 20 Nov 2017  ·  5Komentar  ·  Sumber: PyGithub/PyGithub

Menggunakan metode .get_contents() untuk mencoba mengunduh file besar menimbulkan kesalahan:

{'errors': [{'code': 'too_large', 'field': 'data',
     'resource': 'Blob'}],
     'message': 'This API returns blobs up to 1 MB in size. The requested blob is too large to fetch via the API, but you can use the Git Data API to request blobs up to 100 MB in size.',
     'documentation_url': 'https://developer.github.com/v3/repos/contents/#get-contents'}

Apakah ada cara untuk mendeteksi ini dan meneruskan ke penangan lain yang dapat mengunduh file?

Misalnya, jika sesuatu seperti ini gagal:

contents = repository.get_dir_contents(urllib.parse.quote(server_path), ref=sha)

for content in contents:
   if content.type != 'dir':
     file_content = repository.get_contents(urllib.parse.quote(content.path), ref=sha)

secara opsional kembali ke:

file_content = repository.get_git_blob(content.sha)
question

Komentar yang paling membantu

Saya memiliki masalah yang sama dan akhirnya melakukan sesuatu di sepanjang baris.

  1. jika kita membuang semua file dari direktori dan beberapa lebih besar dari 1M,
 file_contents = repo.get_contents(dir_name, ref=branch)

maka sha ada untuk setiap file_content , dan berikut ini dapat digunakan untuk mengambil gumpalan dari setiap file

for file_content in file_contents:
    try:
        if file_content.encoding != 'base64':
            # some error ...
        # ok... 
    except GithubException:
        # if file_content DOES NOT HAVE encoding, it is a large file 
        blob = repo.get_git_blob(file_content.sha)
        # do something with blob

Jika path_name mengacu pada satu file yang lebih besar dari 1M, harus ada beberapa blok percobaan / pengecualian seperti berikut:

        try:
            res = repo.get_contents(path_name, ref=branch)
            # ok, we have the content
        except GithubException:
           return get_blob_content(repo, branch, path_name)

dimana get_blob_content adalah sesuatu seperti

def get_blob_content(repo, branch, path_name):
    # first get the branch reference
    ref = repo.get_git_ref(f'heads/{branch}')
    # then get the tree
    tree = repo.get_git_tree(ref.object.sha, recursive='/' in path_name).tree
    # look for path in tree
    sha = [x.sha for x in tree if x.path == path_name]
    if not sha:
        # well, not found..
        return None
    # we have sha
    return repo.get_git_blob(sha[0])

Kode nyata dengan pemeriksaan kesalahan lebih panjang, tetapi idenya ada di sini.

Semua 5 komentar

Saya juga pernah mengalami masalah ini sebelumnya. Dalam kasus saya, karena saya selalu memiliki SHA blob, saya hanya menggunakan git_git_blob sebagai gantinya.

Namun, get_git_blob tidak berfungsi untuk semua jenis objek selain blob (karena itu namanya). Anda perlu mengetahui tipe objek sebelum mencoba memanggilnya.

Untuk melakukan fallback, Anda perlu mengetahui dua informasi:

  1. Jenis objek.
  2. SHA objek.

Jika get_contents gagal, itu tidak memberi tahu Anda salah satu dari hal-hal ini. Sejauh yang saya tahu, tidak ada cara yang baik untuk melakukan fallback.

Ditutup sebagai wontfix . Jika ada yang punya ide bagus tentang cara menyelesaikan ini, saya akan dengan senang hati membukanya kembali. Sejauh yang saya tahu, sepertinya tidak mungkin dilakukan dengan cara yang bersih.

Saya memiliki masalah yang sama dan akhirnya melakukan sesuatu di sepanjang baris.

  1. jika kita membuang semua file dari direktori dan beberapa lebih besar dari 1M,
 file_contents = repo.get_contents(dir_name, ref=branch)

maka sha ada untuk setiap file_content , dan berikut ini dapat digunakan untuk mengambil gumpalan dari setiap file

for file_content in file_contents:
    try:
        if file_content.encoding != 'base64':
            # some error ...
        # ok... 
    except GithubException:
        # if file_content DOES NOT HAVE encoding, it is a large file 
        blob = repo.get_git_blob(file_content.sha)
        # do something with blob

Jika path_name mengacu pada satu file yang lebih besar dari 1M, harus ada beberapa blok percobaan / pengecualian seperti berikut:

        try:
            res = repo.get_contents(path_name, ref=branch)
            # ok, we have the content
        except GithubException:
           return get_blob_content(repo, branch, path_name)

dimana get_blob_content adalah sesuatu seperti

def get_blob_content(repo, branch, path_name):
    # first get the branch reference
    ref = repo.get_git_ref(f'heads/{branch}')
    # then get the tree
    tree = repo.get_git_tree(ref.object.sha, recursive='/' in path_name).tree
    # look for path in tree
    sha = [x.sha for x in tree if x.path == path_name]
    if not sha:
        # well, not found..
        return None
    # we have sha
    return repo.get_git_blob(sha[0])

Kode nyata dengan pemeriksaan kesalahan lebih panjang, tetapi idenya ada di sini.

Saat mendapatkan blob, kode berikut akan berguna.

    blob = repo.get_git_blob(sha[0])
    b64 = base64.b64decode(blob.content)
    return b64.decode("utf8")

Selain itu, file pembaruan juga akan mengalami masalah ini.

raise self.__createException(status, responseHeaders, output)

github.GithubException.UnknownObjectException: 404 {"message": "Not Found", "dokumentasi_url": " https://docs.github.com/rest/reference/repos#get -repository-content"} mendapatkan kesalahan ini saat mencoba untuk mengunduh file repositori yang didapat untuk cabang master

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

nixoz2k7 picture nixoz2k7  ·  7Komentar

AdyaAbhra picture AdyaAbhra  ·  5Komentar

mlainez picture mlainez  ·  7Komentar

PeterJCLaw picture PeterJCLaw  ·  6Komentar

nchammas picture nchammas  ·  3Komentar