最直接获取github仓库代码变更的方式是调用/repos/{owner}/{repo}/commits接口,需传iso格式since时间、优先用committer.date、通过sha+文件路径+status生成指纹去重,并建议使用apscheduler定时拉取、pygithub简化操作但注意性能配置。

用 requests 调 GitHub REST API 获取最近提交
GitHub 仓库的代码变更最直接的信号就是新提交,/repos/{owner}/{repo}/commits 是最轻量、权限要求最低的入口。不需要 OAuth Token 就能读公开仓库(限速 60 次/小时),但生产环境务必加 Token,否则容易被限流或返回空结果。
关键点:
-
since参数必须传 ISO 格式时间字符串(如"2024-05-20T00:00:00Z"),不是 Unix 时间戳,也不是本地时区时间 —— 传错会导致漏掉变更 - 响应里
commit.author.date是 commit 作者写入时间,commit.committer.date是实际合并/推送时间,监控应优先用后者 - 分页靠
Link响应头,不是page参数;首次请求带?per_page=100减少请求数
避免重复告警:用 sha + 文件路径做变更指纹
单纯比对提交时间不可靠 —— 多人同时推、rebase 后强制推送、CI 自动提交都会打乱时间顺序。真正稳定的标识是每次提交的 sha,再结合具体变更的文件路径和 patch 类型(add/modify/delete)。
实操建议:
- 每次拉到新提交后,用
/repos/{owner}/{repo}/commits/{sha}补全files字段,过滤出你关心的路径(如只盯src/或config.yaml) - 把
(sha, filename, status)拼成字符串哈希(如hashlib.md5(...).hexdigest()[:8]),存进本地 SQLite 或 Redis,查重快且不依赖外部服务 - 别用
git log本地 clone 后解析 —— 网络延迟高、磁盘 IO 重、还可能遇到 submodule 或大仓库卡死
用 github.Github PyGithub 库简化复杂操作
如果需要处理 PR、issue 关联、branch 保护规则或私有仓库,PyGithub 比裸 requests 省心。但它默认会缓存大量无关字段,导致内存暴涨或超时。
Git 提交信息生成器。根据代码变更内容自动生成符合 Conventional Commits 规范的提交信息,包含类型、范围、简短描述、详细说明和关联的 Issue/需求号。触发词:生成提交信息、提交信息、commit message、git commit、生成 commit 信息
注意这些坑:
- 初始化时加
per_page=30和timeout=15,例如:g = Github(token, per_page=30, timeout=15) - 获取提交列表时,显式调用
.repolist.get_commits(sha=branch),别用.get_repo().get_commits()—— 后者默认查main且不支持since,容易误判 - 遍历
commit.files前先检查commit.files是否为None(某些轻量提交没这个字段),否则抛AttributeError
定时执行别硬写 time.sleep(),改用 APScheduler
用 while True: do_check(); time.sleep(300) 看似简单,但进程挂了就停,日志难追踪,也无法动态调间隔。用 APScheduler 的 BlockingScheduler 更稳。
配置要点:
- 用
BackgroundScheduler配合atexit注册清理,避免 SIGINT 杀不干净留下僵尸 job - 任务函数内必须包
try/except Exception as e,把异常写进日志(别吞掉),否则失败后 scheduler 不报错也不重试 - 如果监控多个仓库,每个任务设独立
id,方便运行时用scheduler.remove_job(id)动态启停
真正难的不是拉数据,而是判断“这次变更是否值得通知”——比如 CI 自动更新 lockfile、文档 typo 修正、或是某行核心逻辑被删。这得靠你定义规则,API 只负责把 raw change 交到你手上。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










