用于Github的Python API,获取特定分支的特定目录中的内容,而不返回所有内容



使用PyGithub API,我试图从Github托管的存储库的特定分支中检索特定文件夹中的所有内容。我不能分享实际的存储库或关于数据的细节,但我使用的代码是这样的:

import github
import json
import requests
import base64
from collections import namedtuple
Package = namedtuple('Package', 'name version')
# Parameters
gh_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
header = {"Authorization": f"token {gh_token}"}
gh_hostname = 'devtopia.xxx.com'
gh = github.Github(base_url=f'https://{gh_hostname}/api/v3', login_or_token = gh_token)
repo_name = "xxxxxxxxx/SupportFiles"
conda_meta = "xxxxxxx/bin/Python/envs/xxxxxx-xx/conda-meta"
repo = gh.get_repo(repo_name)

def parse_conda_meta(branch):
package_list = []
meta_contents = repo.get_contents(conda_meta, ref=branch)  #<< Returns less files than expected for 
# a specified branch "xxx/release/3.2.0",
# returns expected number of files for 
# "master" branch.
for i, pkg in enumerate(meta_contents):
if ".json" in pkg.name:  # filter for JSON files
print(i, pkg.name)
# Need to use GitHub Data API (REST) blobs instead of easier
# `github` with `pkg.decoded_content` here because that method
# only works with files <= 1MB whereas Data API allows for
# reading files <= 100MB.
resp = requests.get(f"https://devtopia.xxxx.com/api/v3/repos/xxxxxxxxx/SupportFiles/git/blobs/{pkg.sha}?ref={branch}", headers=header)
pkg_cont = json.loads(base64.b64decode(json.loads(resp.content)["content"]))
package_list.append(Package(pkg_cont['name'], pkg_cont['version']))
else:
print('>>', i, pkg.name)
return package_list

if __name__ == "__main__":
pkgs = parse_conda_meta("xxx/release/3.2.0")
print(pkgs)
print(len(pkgs))

由于某些原因,我无法得到底部,我没有得到repo.get_contents(conda_meta, ref=branch)返回的正确文件数量。对于我指定的分支,当签出该分支时,我在conda-meta文件夹中看到186个文件。但是,repo.get_contents(conda_meta, ref=branch)只返回182,我缺少四个JSON文件。

是否有一些限制,我不知道的repo.get_contents?我一直在阅读文档,但找不到任何暗示我有问题的东西。有一点是关于它只处理最大1mb的文件,但我看到返回的文件比这个大(例如:python是1.204mb,并在文件列表中返回)。我相信这只适用于读取超过1mb的文件内容,我通过使用GitHub数据API (REST)进一步下游处理。我做错什么了吗?

感谢阅读,任何帮助这是非常感激!

更新解决方案!

问题:

经过一番深入研究,我找到了问题的原因。这与上面的代码或repo.get_contents(conda_meta, ref=branch)没有关系。它实际上是一个unix/windows冲突,被错误地引入到我们的存储库中,用于这个特定的分支"xxx/release/3.2.0";但在其他地方却没有。

那么问题是什么呢?NTFS(以及更广泛的Windows)默认情况下是不区分大小写的,但是Git来自Unix世界,默认情况下是区分大小写的

我们无意中在conda_meta(xxxxxx/bin/)的bin目录下为Python创建了两个文件夹,其中一个文件夹名为"Python"还有一个叫做"python"。(注意小写)。在本地拉取存储库时,只有"Python"文件夹显示包含所有168个文件。然而,在GitHub上,带有"Python"包含182个文件,而路径带有"python"包含剩余的4个文件。

解决方案:

解决方案是添加一个conda_meta_folders参数,该参数获取到parse_conda_meta的路径列表并搜索每个目录。虽然可能有一个更圆滑的解决方案,我正在研究是否有可能用PyGithub API做git config core.ignorecase true这样的事情。有人知道是否有可能让PyGithub尊重这一点或为此进行配置吗?

相关内容

最新更新