有没有办法查看哪些待处理的拉取请求会影响特定文件?

Tre*_*key 5 git version-control branch github

我想对一个大型开源项目进行更改。
由于数千个拉取请求已经等待处理,
很难知道是否有人还没有做出类似的更改。

我可以尝试根据关键字搜索问题,但我可能会忽略对文件进行更改的拉取请求。

如何根据文件名进行搜索,哪些拉取请求对文件进行了更改?github上似乎没有办法做到这一点。是否有一个 git 命令可以运行来打印已修改特定文件的所有拉取请求/分支?

lar*_*sks 5

ElpieKay 的回答基本上就是我在评论中所建议的;这个答案有一个示例 shell 脚本,可以很大程度上自动化该过程。

事实证明,获取开放拉取请求的列表相当容易;您只需使用以下curl命令行即可获取打开请求的 JSON 列表:

curl https://api.github.com/repos/<user>/<repo>/pulls
Run Code Online (Sandbox Code Playgroud)

例如:

curl https://api.github.com/repos/centos-opstools/opstools-ansible/pulls
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用类似的方法从中提取拉取请求编号jq-s参数curl只是抑制将curl输出传递到另一个命令时获得的某些状态输出):

curl -s https://api.github.com/repos/centos-opstools/opstools-ansible/pulls |
jq '.[]|.number'
Run Code Online (Sandbox Code Playgroud)

然后,您可以获取该命令的输出并将其传输到循环中以仅获取这些拉取请求并检查它们是否有感兴趣的文件:

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
Run Code Online (Sandbox Code Playgroud)

这会产生如下输出:

PR 82
PR 71
PR 69
Run Code Online (Sandbox Code Playgroud)

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


Elp*_*Kay 0

将拉取请求中的所有分支提取到本地存储库中,并为每个分支创建一个本地分支。

git fetch <remote-in-Nth-pull-request> <branch-in-Nth-pull-request>:prN
Run Code Online (Sandbox Code Playgroud)

如果有数千个,N可能是从 0 到几千个。

假设您的主分支是master,所有其他分支(包括分叉分支)都是直接或间接从master.

git log $(git merge-base master prN)..prN -- <foo/bar.c>
Run Code Online (Sandbox Code Playgroud)

此命令列出了从 分叉foo/bar.c后发生更改的所有提交。如果输出不为空,我们可以断定已经改变了。branch-in-Nth-pull-requestmasterprNfoo/bar.c

为每个循环运行此命令,prN您可以获得所有已更改的分支foo/bar.c

我想可能有一些更简单的方法可以完成这项工作,但你可以尝试一下这个。