如何通过命令行更新GitHub Pull Request的首条评论
问题根因
你拿不到PR首条内容的核心原因是接口用错了:PR页面最顶部的首条内容不属于普通Issue评论范畴,它是Pull Request资源本身的描述字段(body),你之前调用的Issue评论列表接口,只会返回PR创建完成后用户追加的普通评论,自然不会包含这条初始内容。
具体实现方案
首先明确你的目标场景,对应选实现逻辑即可,完全不需要依托GitHub Actions:
- 场景1:需要修改的是PR创建时自带的顶部初始描述
这条内容绑定在PR资源本身,不在评论列表存储。直接获取PR详情就能拿到对应内容,调用PR更新接口即可修改,不需要遍历评论。
基于官方GitHub CLI工具gh的实现命令(不需要手动处理鉴权、请求封装):- 读取PR初始描述内容:
gh pr view <PR编号> --json body -q .body- 更新PR初始描述内容:
gh pr edit <PR编号> --body "替换后的新描述内容" - 场景2:需要实现和sticky-pull-request-comment完全一致的固定评论效果——即更新你/你的服务账号之前发的专属置顶评论,不改动PR自带的初始描述
这个场景下不要用普通Issue评论列表接口,按以下逻辑实现即可:- 拉取PR下的全量评论(包含普通评论、审查类评论),不要只拉取Issue类型评论
- 每次发专属评论时,在内容末尾加一个只有你能识别的隐藏标记,比如HTML注释格式的
<!-- MY_STICKY_COMMENT_MARK_2024 -->,这个标记对普通浏览用户不可见 - 遍历拉取到的全量评论,匹配内容中带专属标记的条目:如果能匹配到,直接取这条评论的ID调用更新接口修改内容即可;如果匹配不到,就新建一条评论,内容里带上专属标记
基于gh的核心实现命令:
# 拉取PR下所有评论,输出评论ID和对应内容,用于匹配标记 gh pr view <PR编号> --json comments -q '.comments[] | "\(.id) \(.body)"' # 匹配到目标评论ID后,更新对应评论 gh api -X PATCH repos/<仓库所属账号>/<仓库名>/issues/comments/<目标评论ID> -f body="新的评论内容<!-- MY_STICKY_COMMENT_MARK_2024 -->" # 未匹配到目标评论时,新建带标记的评论 gh pr comment <PR编号> --body "新的评论内容<!-- MY_STICKY_COMMENT_MARK_2024 -->"
注意:所有接口调用使用的Token,需要提前开通对应仓库的Pull Request读写权限,否则会返回权限错误。
内容的提问来源于stack exchange,提问作者Eyal Gerber
相关产品推荐
相关产品推荐

