有一个大型的开源项目,我想对其进行更改
有数千个拉取请求已经挂起,
很难知道某人是否还没有做出类似的改变。
我可以尝试根据关键字搜索问题,但我可能会忽略对文件进行更改的拉取请求。
如何根据文件名进行搜索,哪些拉取请求会对文件进行更改?似乎没有办法从github做到这一点。是否有一个git命令可以运行以打印已修改特定文件的所有pull-requests / branches?
答案 0 :(得分:0)
将pull-requests中的所有分支获取到本地repo中,并为每个分支创建一个本地分支。
git fetch <remote-in-Nth-pull-request> <branch-in-Nth-pull-request>:prN
如果有数千,N
可能是0到数千。
假设您的主分支是master
,并且所有其他分支(包括分支分支)都是直接或间接地从master
的某些提交中创建的。
git log $(git merge-base master prN)..prN -- <foo/bar.c>
此命令列出foo/bar.c
从branch-in-Nth-pull-request
分叉后更改master
的所有提交。如果输出不为空,我们可以得出结论prN
已更改foo/bar.c
。
在每个prN
的循环中运行此命令,您可以获得所有已更改的分支foo/bar.c
我想可能有一些更简单的方法来完成这项工作,但你可以试试这个。
答案 1 :(得分:0)
ElpieKay的回答基本上就是我在评论中提出的建议; this answer有一个示例shell脚本,可以在很大程度上自动化该过程。
事实证明,获得开放拉取请求列表相当容易;您可以使用以下curl
命令行来获取打开请求的JSON列表:
curl https://api.github.com/repos/<user>/<repo>/pulls
例如:
curl https://api.github.com/repos/centos-opstools/opstools-ansible/pulls
然后您可以使用jq
之类的内容提取拉取请求编号(-s
参数到curl
只会抑制将卷曲输出传递给另一个命令时获得的某些状态输出):
curl -s https://api.github.com/repos/centos-opstools/opstools-ansible/pulls |
jq '.[]|.number'
然后您可以获取该命令的输出并将其传递到循环中以获取这些拉取请求并检查它们以查找感兴趣的文件:
curl -s https://api.github.com/repos/centos-opstools/opstools-ansible/pulls |
jq '.[]|.number' |
while read pr; do
git fetch origin refs/pull/$pr/head > /dev/null
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
是包含您感兴趣的文件的变量。