Python 如何使用github3.py仅拉取修改的提交/拉取请求?

Python 如何使用github3.py仅拉取修改的提交/拉取请求?,python,github,github3.py,Python,Github,Github3.py,我正在编写一个ETL作业,其中保存了数据仓库中来自GitHubrepo的提交、请求和文件的更新列表。我目前正在存储并向各种迭代器传递etag,但我认为我不了解如何正确地执行它 我也很难理解object.refresh(conditional=True)到底在做什么。如果我迭代一个repo上的所有提交,然后对每个提交调用commit.refresh(conditional=True),我是否会收到一个304异常以进行处理,这样我就知道不会将该提交包含在数据仓库中,因为它没有更改?拉取请求也是如此。

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

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

如果我将
etag
传递给
repo.iter\u提交
,它将只返回修改后的提交,还是返回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...
我将每个迭代器包装在一个包装类中,该类负责检索以前的
etag
,在迭代后存储
etag
,并检查速率限制

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

使用
github3.py
API实现这一点的正确和最有效的方法是什么

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

因此etag的工作方式如下:

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

  • 您可以使用ETag值发出请求

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

    • 如果没有更改,您将收到
      204无内容的响应

  • ETag不允许您从原来的位置恢复,也没有好的方法可以从API中断的位置恢复

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

  • 使用存储库上的所有当前提交
  • 注册一个只订阅
    push
    事件的webhook
  • 在人们将其他提交推送到GitHub时处理这些提交