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)
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:
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.
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
Komentar yang paling membantu
Saya memiliki masalah yang sama dan akhirnya melakukan sesuatu di sepanjang baris.
maka
sha
ada untuk setiapfile_content
, dan berikut ini dapat digunakan untuk mengambil gumpalan dari setiap fileJika
path_name
mengacu pada satu file yang lebih besar dari 1M, harus ada beberapa blok percobaan / pengecualian seperti berikut:dimana
get_blob_content
adalah sesuatu sepertiKode nyata dengan pemeriksaan kesalahan lebih panjang, tetapi idenya ada di sini.