0

我正在编写一个 ETL 作业,在该作业中,我GitHub在数据仓库中的存储库中保留更新的提交、拉取请求和文件列表。我目前正在存储并传递etags给各种迭代器,但我认为我不理解如何正确地做到这一点。

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

如果我传递一个etagto 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的、迭代后的存储etags和检查速率限制。

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

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

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

4

1 回答 1

1

所以 ETags 的工作方式如下:

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

  2. 您使用 ETag 值发出请求

    • 如果资源发生变化,则必须再次消耗整个资源

    • 如果没有变化,您将收到204 No Content回复

ETag 不允许您从原来的位置恢复,并且没有好的方法可以从您离开 API 的位置恢复。

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

  1. 使用存储库上的所有现有提交
  2. 注册一个只订阅push事件的 webhook
  3. 当人们将它们推送到 GitHub 时,处理其余的提交。
于 2017-04-05T14:07:06.077 回答