处理 PR

预计将会收到超过 200 条 Pull Request,因此需要使用 GitHub CLI 工具 gh 来合并 Pull Request,提高合并的工作效率。

获取 PR 列表

获取所有 Open 状态的 PR 列表,然后合并所有可合并的 PR。

# 获取 PR 列表
cmd = "gh pr list -s open --json number,title,mergeable"
prs = jsonlite::fromJSON(system(cmd, intern = TRUE)) |> dplyr::arrange(number)

prs

自动合并

对于没有冲突的 PR,直接合并。

使用 gh 合并

for (i in seq_len(nrow(prs))) {
  if (prs$mergeable[i] == "MERGEABLE") {
    cmd = paste("gh pr merge", prs$number[i], "--merge --auto")
    system(cmd)

    Sys.sleep(30)
  }
}

每次合并之后,需要再次获取 PR 列表,以更新 mergeable 状态。

在本地合并

将 PR 下载到本地,然后合并到本地分支。合并完成后,再 push 到远程分支。从而完成合并。

# 下载 PR 到本地
for (i in seq_len(nrow(prs))) {
  pr = prs$number[i]
  cmd = glue::glue("git fetch origin pull/{pr}/head:{pr} && git merge {pr} --auto -m 'merge pull/{pr}' && git branch -d {pr}")
  system(cmd)

}

继续改进的话,可以通过检查 system() 的返回值,来判断是否存在冲突。

手动合并

对于有冲突的 PR,需要手动解决冲突。

prs[prs$mergeable != "MERGEABLE", ]

实施步骤:

git pull
git fetch origin pull/123/head:pr  # 123 是 PR 号
git merge pr

解决冲突后,提交合并。

git add <冲突文件>
git commit -m "Merge PR #123"
git push

删掉本地分支。

git branch -d pr

将上面的操作简化为三行命令为:

git fetch origin pull/46/head:pr && git merge pr
# 在这里打开冲突文件,人工解决冲突后,然后才能继续
git commit -am 'fix' && git branch -d pr