git 有没有一种方法可以查看哪些挂起的拉取请求会影响特定的文件?

xpcnnkqh  于 2023-09-29  发布在  Git
关注(0)|答案(3)|浏览(107)

有一个大型的开源项目,我想做一些修改。
由于已经有数千个pull request等待处理,
很难知道是否有人没有做过类似的改变。
我可以尝试基于关键字搜索问题,但我可能会忽略对文件进行更改的pull请求。
如何根据文件名进行搜索,哪些拉取请求对文件进行了更改?在GitHub上似乎没有办法做到这一点。有没有一个git命令我可以运行来打印所有修改了特定文件的pull-requests /branch?

b1uwtaje

b1uwtaje1#

ElpieKay的回答基本上就是我在评论中所建议的;这个答案有一个示例shell脚本,它将在很大程度上自动化该过程。
事实证明,获取打开的拉取请求列表相当容易;你可以使用下面的curl命令行来获取打开请求的JSON列表:

curl https://api.github.com/repos/<user>/<repo>/pulls

举例来说:

curl https://api.github.com/repos/centos-opstools/opstools-ansible/pulls

然后,您可以使用类似jq的东西从中提取pull请求编号(curl-s参数只是在将curl输出管道传输到另一个命令时抑制了一些状态输出):

curl -s https://api.github.com/repos/centos-opstools/opstools-ansible/pulls |
jq '.[]|.number'

然后,您可以获取该命令的输出并将其导入一个循环,以获取这些pull请求并检查它们是否有兴趣的文件:

curl -s https://api.github.com/repos/centos-opstools/opstools-ansible/pulls |
jq '.[]|.number' |
while read pr; do
  git fetch --quiet origin refs/pull/$pr/head
  if git show --pretty=format:'' --name-only FETCH_HEAD | grep -q $file_i_care_about; then
    echo "PR $pr"
  fi
done

这将产生如下输出:

PR 82
PR 71
PR 69

上面假设变量file_i_care_about是一个包含您感兴趣的文件的变量。

9nvpjoqh

9nvpjoqh2#

将pull-request中的所有分支提取到本地仓库中,并为每个分支创建一个本地分支。

git fetch <remote-in-Nth-pull-request> <branch-in-Nth-pull-request>:prN

如果有数千个,N可以从0到数千个。
假设你的主分支是master,所有其他分支包括forked分支都是直接或间接从master的一些提交创建的。

git log $(git merge-base master prN)..prN -- <foo/bar.c>

此命令列出了在从master派生branch-in-Nth-pull-request之后更改foo/bar.c的所有提交。如果输出不为空,我们可以断定prN已经改变了foo/bar.c
对每个prN循环运行此命令,您可以获得所有更改了foo/bar.c的分支
我想可能有一些更简单的方法来做这项工作,但你可以试试这个。

jmp7cifd

jmp7cifd3#

这里有一个小脚本,我拼凑在一起,以解决类似的问题:

#grab all the PRs and sort them so the newest ones are first in the list:
git ls-remote origin 'pull/*/head' | awk '{print $2}' | grep -oE '[0-9]+' | sort -n | tail -r |
#read each PR and filter for any that have changed file in question 
while read pr; do
  echo "Searching $pr"
  if gh pr view $pr --json files --jq '.files.[].path' | grep -q "yourFileNameHere"; then
    echo "Found in PR $pr - $(gh pr view $pr --json state --jq '.state')" 
  fi
done

(btw你需要github cli工具gh -https://cli.github.com/

相关问题