如何使用github3.py只拉修改过的提交/拉请求?

2024-04-18 08:16:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个ETL作业,其中保存了来自数据仓库中的GitHubrepo的提交、请求和文件的更新列表。我目前正在存储并将etags传递给各种迭代器,但我不知道如何正确地执行它。在

我也很难理解object.refresh(conditional=True)到底在做什么。如果我迭代一个repo上的所有提交,然后对每个提交调用commit.refresh(conditional=True),那么我会收到304异常来处理吗,这样我就知道不应该将该提交包括在数据仓库中,因为它没有更改吗?拉取请求也是如此。当我调用repository.refresh(conditional=True)时,它似乎忽略了repo中的新提交。在

如果我将一个etag传递给repo.iter_commits,它将只返回修改后的提交,还是在有任何更改的情况下返回repo的所有提交?在

这是我当前使用的基本工作流:

from github3 import login

gh = login(token='access_token')
repos = (repo.refresh(conditional=True) for repo in gh.iter_repos(etag='previous_etag'))

commit_iters = (commit_iter for repo in repos for commit_iter in repo.iter_commits(etag='prev_etag'))

for commit_iter in commit_iters:
    for commit in commit_iter:
        commit.refresh(conditional=True)
        # pull various attributes, write to file, etc...

我将每个迭代器包装在一个包装器类中,该类处理检索前一个etags,在迭代后存储{},并检查速率限制。在

我的首要目标是提取自上次请求以来发生更改的任何新提交/请求。我假设此时我想从数据库中删除现有条目并用新条目更新。在

使用github3.pyAPI实现这一点的正确且最有效的方法是什么?在

编辑: 我再次检查了文档,有一个since参数可以解决提交问题。所以我只需要知道如何正确地使用etag来获取更新的pull请求数据。在


Tags: intrueforloginreporefreshrepos数据仓库
1条回答
网友
1楼 · 发布于 2024-04-18 08:16:51

因此etag的工作方式如下:

  1. 您发出请求并使用资源并存储etag

  2. 您使用ETag值发出请求

    • 如果资源发生更改,则必须再次使用整个资源

    • 如果没有变化,您将收到204 No Content响应

ETag不允许您从原来的位置恢复,也没有好的方法可以从停止使用API的地方恢复。在

老实说,我认为你可能想做的是:

  1. 使用存储库中所有当前提交
  2. 注册一个只订阅push事件的webhook
  3. 在人们将其余提交推送到GitHub时处理其余提交。在

相关问题 更多 >