能否通过日期过滤GitLab Project API?求非文件追踪实现方案
好问题!确实GitLab的Projects REST API目前没有提供直接按修改日期过滤的参数,不过我们有几个靠谱的替代方案来实现你找上周修改过的项目的需求:
REST API返回的每个项目对象里都有一个last_activity_at字段,它记录了项目最后一次活动(包括代码提交、Issue修改、配置变更等)的时间。你可以先批量拉取项目数据,再在本地脚本里筛选出时间落在过去7天内的项目。
举个命令行的例子,用curl结合jq(一款命令行JSON处理工具)就能快速实现:
- 先确定上周的起始时间(用ISO 8601格式,比如假设今天是2024-05-20,上周起始就是
2024-05-13T00:00:00Z) - 调用API并过滤结果:
curl --header "PRIVATE-TOKEN: <你的GitLab访问令牌>" "https://gitlab.example.com/api/v4/projects?per_page=100&page=1" | jq '.[] | select(.last_activity_at >= "2024-05-13T00:00:00Z") | .name, .last_activity_at'
如果你的项目总数超过100,记得循环处理分页(每次递增page参数,直到返回的项目数组为空)。如果项目数量很多,用Python这类语言写个小脚本会更方便,用requests库调用API后做日期筛选,处理分页也更灵活。
GitLab的GraphQL API支持更精准的查询,你可以直接在查询语句里指定lastActivityAt的时间范围,不用拉取所有项目再本地过滤,效率更高。
比如这个查询就能返回过去7天内有活动的项目:
query { projects(last: 100, orderBy: LAST_ACTIVITY_AT, sort: DESC) { nodes { name lastActivityAt webUrl } pageInfo { endCursor hasNextPage } } }
如果需要严格匹配时间范围,加上filter参数即可:
query { projects(last: 100, orderBy: LAST_ACTIVITY_AT, sort: DESC, filter: {lastActivityAt: {gte: "2024-05-13T00:00:00Z"}}) { nodes { name lastActivityAt webUrl } pageInfo { endCursor hasNextPage } } }
用curl调用GraphQL API的示例:
curl --header "PRIVATE-TOKEN: <你的GitLab访问令牌>" --request POST --data '{"query": "query { projects(last: 100, orderBy: LAST_ACTIVITY_AT, sort: DESC, filter: {lastActivityAt: {gte: \"2024-05-13T00:00:00Z\"}}) { nodes { name lastActivityAt webUrl } pageInfo { endCursor hasNextPage } } }"}' "https://gitlab.example.com/api/graphql"
如果结果超过100条,利用pageInfo里的endCursor参数就能实现分页查询。
这里的last_activity_at覆盖了项目的所有活动类型,如果你需要仅筛选代码仓库有提交修改的项目,那可能需要额外调用每个项目的Commits API,筛选提交时间在过去7天内的记录,但这样会增加API请求次数,效率稍低。不过如果你的需求是“有过修改动作的项目”,last_activity_at已经能覆盖绝大多数场景了。
内容的提问来源于stack exchange,提问作者alphao




