如何查找哪个 PR 最后触及了 GitHub 上的文件?

问题描述 投票:0回答:1

我在 GitHub 上托管了项目。我的存储库已禁用推送到分支

main
,只有拉取请求可以合并到
main
。我有一个要求,即给定存储库下的文件,我想确定哪个 PR 最后添加/更新/删除了该文件。我没有找到 GitHub API 来执行此操作。有办法吗?

github github-api
1个回答
0
投票

我可以想到三个选择:

  1. 在本地使用Git查看修改文件的最新提交的提交标题(假设标题中没有手动删除PR号):

    grep -Po '#\K\d+(?=\)$)' <<< "$(git log --format=%s --max-count=1 -- FILE)"
    

    正则表达式查找

    #
    后跟一位或多位数字,然后是
    )
    和行尾。
    #
    )
    未被捕获。因此,标题
    Add a new feature (#123)
    将变为
    123

  2. 使用 REST API 获取文件的最新提交,并使用 jq 提取 PR 编号(再次假设未修改提交标题以将其删除):

    gh api repos/super-linter/super-linter/commits?path=lib/linter.sh \
        --jq '
            first.commit.message
            | split("\n")
            | first
            | capture("\\(#(?<n>\\d+)\\)$").n
        '
    
  3. 更健壮,因为它不依赖于提交标题的字符串解析,但也更昂贵:检索拉取请求并按它们接触的文件进行过滤,然后获取您感兴趣的文件的最新文件的编号再次以 super-linter 和

    lib/linter.sh
    为例:

    gh pr list --base main --state merged --json files,mergedAt,number --limit=50 \
        --jq '
            map(select(
              .files
              | map(.path)
              | select(index("lib/linter.sh") >= 0)
            ))
            | sort_by(.mergedAt)
            | last.number
        '
    

    如果文件有一段时间没有修改,您可能需要调整

    --limit
    值。要参数化文件名,您可以在环境中设置它,然后通过
    $ENV
    对象
    引用它,例如

    file='lib/linter.sh' gh pr list ... --jq '... $ENV.file ...'
    
© www.soinside.com 2019 - 2024. All rights reserved.