解决方案
我最终得到了类似于以下的解决方案:
git branch --remotes --no-merged origin/master | \
grep --fixed-strings --invert-match --file=<( \
echo prod branch2 branch3 branchN | \
tr ' ' '\n' | \
xargs --replace \
git branch --remotes --merged origin/{} \
)
说明
以下是上述命令的不同部分的作用及其输出的解释:
$ echo prod branch2 branch3 branchN
prod branch2 branch3 branchN
- 简单地输出由空格分隔的给定分支的名称。
$ echo prod branch2 branch3 branchN | \
> tr ' ' '\n'
prod
branch2
branch3
branchN
- 输出相同,但每个分支都换行。
echo prod branch2 branch3 branchN | \
> tr ' ' '\n' | \
> xargs --replace \
> git branch --remotes --merged origin/{}
- 将为每个列出的分支调用git branch 命令,如下所示:
git branch --remotes --merged origin/prod;
git branch --remotes --merged origin/branch2;
git branch --remotes --merged origin/branch3;
git branch --remotes --merged origin/branchN;
- 也就是说,它将列出所有被合并到给定分支中的远程分支(由新行分隔),例如:
origin/some-branch-merged-into-prod
origin/branch2A-merged-into-branch2
origin/branch2B-merged-into-branch2
origin/some-other-branch-merged-into-branchN
git branch --remotes --no-merged origin/master
- 这将列出所有未合并到 origin/master 的分支,例如:
origin/some-branch-not-merged-into-any-given-branch
origin/branch2A-merged-into-branch2
origin/some-other-branch-merged-into-branchN
最后,整个命令将从未合并到@987654332的分支列表中排除合并到echo命令中给出的任何分支中的分支列表@ - 从而为我们提供未合并到任何给定分支的分支列表,例如:
origin/some-branch-not-merged-into-any-given-branch