如何使用 github3.py 仅提取修改后的 commits/pull 请求?
How to pull only modified commits/pull requests using github3.py?
我正在编写一个 ETL 作业,我在其中保留来自我们数据仓库中 GitHub
存储库的提交、拉取请求和文件的更新列表。我目前正在存储 etags
并将其传递给各种迭代器,但我不认为我理解如何正确地做到这一点。
我也很难理解 object.refresh(conditional=True)
到底在做什么。如果我遍历 repo 上的所有提交,然后在每个提交上调用 commit.refresh(conditional=True)
,我是否会收到一个 304 异常来处理,以便我知道不要将该提交包含在数据仓库中,因为它没有更改?拉取请求也是如此。当我调用 repository.refresh(conditional=True)
时,它似乎忽略了存储库中的新提交。
如果我将 etag
传递给 repo.iter_commits
,它会只 return 修改提交,还是 return 回购的所有提交(如果有)有什么变化吗?
这是我目前使用的基本工作流程:
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...
我将每个迭代器包装在一个包装器 class 中,该包装器处理检索先前的 etags
、在迭代后存储 etags
并检查速率限制。
我的首要目标是提取自上次请求以来发生变化的所有新 commits/pull 请求。我假设那时我想从数据库中删除现有条目并使用新条目进行更新。
使用 github3.py
API 实现此目的的正确且最有效的方法是什么?
编辑:
我再次检查了文档,有一个 since
参数可以解决我的提交问题。所以我只需要知道如何正确使用 etags 来拉取更新的拉取请求数据。
因此 ETag 按以下方式工作:
您发出请求并使用资源并存储 etag
您使用 ETag 值发出请求
如果资源有变化,必须重新消耗整个资源
如果没有变化,您将收到204 No Content
回复
ETag 不允许您从原来的位置继续,也没有很好的方法从您离开的地方继续 API。
老实说,我想你可能想要做的是:
- 使用存储库中的所有现有提交
- 注册一个仅订阅
push
事件的 webhook
- 在人们将它们推送到 GitHub 时处理其余的提交。
我正在编写一个 ETL 作业,我在其中保留来自我们数据仓库中 GitHub
存储库的提交、拉取请求和文件的更新列表。我目前正在存储 etags
并将其传递给各种迭代器,但我不认为我理解如何正确地做到这一点。
我也很难理解 object.refresh(conditional=True)
到底在做什么。如果我遍历 repo 上的所有提交,然后在每个提交上调用 commit.refresh(conditional=True)
,我是否会收到一个 304 异常来处理,以便我知道不要将该提交包含在数据仓库中,因为它没有更改?拉取请求也是如此。当我调用 repository.refresh(conditional=True)
时,它似乎忽略了存储库中的新提交。
如果我将 etag
传递给 repo.iter_commits
,它会只 return 修改提交,还是 return 回购的所有提交(如果有)有什么变化吗?
这是我目前使用的基本工作流程:
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...
我将每个迭代器包装在一个包装器 class 中,该包装器处理检索先前的 etags
、在迭代后存储 etags
并检查速率限制。
我的首要目标是提取自上次请求以来发生变化的所有新 commits/pull 请求。我假设那时我想从数据库中删除现有条目并使用新条目进行更新。
使用 github3.py
API 实现此目的的正确且最有效的方法是什么?
编辑:
我再次检查了文档,有一个 since
参数可以解决我的提交问题。所以我只需要知道如何正确使用 etags 来拉取更新的拉取请求数据。
因此 ETag 按以下方式工作:
您发出请求并使用资源并存储 etag
您使用 ETag 值发出请求
如果资源有变化,必须重新消耗整个资源
如果没有变化,您将收到
204 No Content
回复
ETag 不允许您从原来的位置继续,也没有很好的方法从您离开的地方继续 API。
老实说,我想你可能想要做的是:
- 使用存储库中的所有现有提交
- 注册一个仅订阅
push
事件的 webhook - 在人们将它们推送到 GitHub 时处理其余的提交。