如何使用python-gitlab从GitLab合并请求中获取讨论线程?
重建GitLab合并请求讨论线程的思路
GitLab的Note对象包含几个核心字段用于关联讨论线程,你可以通过以下方式实现关联:
1. 核心关联字段:discussion_id
所有属于同一讨论线程的Note会共享同一个discussion_id。你可以直接按这个字段对Note进行分组,同一分组内的内容就属于同一个讨论线程。
注:你的示例数据未展示该字段,但GitLab API返回的完整Note对象必然包含discussion_id,可在_attrs中找到。
2. 区分Note类型与线程场景
- DiffNote:这类是代码行级别的评论,同一代码块下的所有评论会共用
discussion_id,对应代码评审的讨论线程。 - 普通Note:MR全局区域的评论,若存在回复,主评论与所有回复也会共享
discussion_id。
3. 还原讨论顺序
同一线程内的Note,可通过created_at字段按时间排序,就能还原讨论的先后逻辑。
4. 代码实现调整
你可以修改现有代码,按discussion_id组织数据:
import gitlab import json from collections import defaultdict gl = gitlab.Gitlab("https://gitlab.com/", private_token='xxx') project = gl.projects.get(47098438) mr = project.mergerequests.get(2) notes = mr.notes.list(all=True) # 加all=True获取全部评论,避免分页遗漏 discussions = defaultdict(list) for n in notes: n_attrs = mr.notes.get(n.id).__dict__['_attrs'] discussions[n_attrs['discussion_id']].append(n_attrs) # 对每个线程内的评论按创建时间排序 for thread_id in discussions: discussions[thread_id].sort(key=lambda x: x['created_at']) with open("threaded_notes.json", "w") as outfile: json.dump(dict(discussions), outfile, indent=2)
额外细节
- 若某条Note是回复特定评论,会包含
note_id字段(指向父评论ID),可利用它构建更精细的回复层级链。 - 注意默认
notes.list()仅返回第一页数据,必须加all=True才能获取全部评论。
内容的提问来源于stack exchange,提问作者mopfbm
相关产品推荐
相关产品推荐

