【问题标题】:How to pull only modified commits/pull requests using github3.py?如何使用 github3.py 仅拉取修改过的提交/拉取请求?
【发布时间】:2017-08-30 00:53:36
【问题描述】:

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

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

如果我将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,在迭代后存储etags,并检查速率限制。

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

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

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

【问题讨论】:

    标签: python github github3.py


    【解决方案1】:

    所以 ETags 的工作方式如下:

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

    2. 您使用 ETag 值发出请求

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2021-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2014-04-15
      • 2018-06-21
      • 1970-01-01
      • 2019-06-28
      相关资源
      最近更新 更多