git 将管道对象作为输入传递到外部应用程序

jgwigjjp  于 2023-09-29  发布在  Git
关注(0)|答案(1)|浏览(113)

是否可以将PowerShell管道中的对象作为参数传递给外部应用程序?
我尝试在PowerShell中重写以下bash语句:
git show-ref | cut -d' ' -f2 | grep -E 'pull|merge-requests' | xargs -r -L1 git update-ref -d
分解一下:
git show-ref列出了git仓库中的refs,结果如下:

cb8f7f4e08f64daaa18cca53d847b4866c48e006 refs/heads/master 
ec8aa722205111c5b77df5d3f1816c31377a094b refs/merge-requests/1/head 
4743558250a7b76880e46efdf980ababf20ca5f9 refs/merge-requests/1/merge 
449bf02bc4e323cb77d07c02aa461f8ef809e00d refs/tags/BeforeActivityChanges 
3e41178d9e51cf928824d008fa8e653cc2d8d74e refs/tags/WebServicesErrors_Alerting

cut -d' ' -f2然后分割空格上的每一行并返回第二个字段:

refs/heads/master
refs/merge-requests/1/head
refs/merge-requests/1/merge
refs/tags/BeforeActivityChanges
refs/tags/WebServicesErrors_Alerting

grep -E 'pull|merge-requests'过滤结果,只返回包含单词“pull”或单词“merge-requests”的结果:

refs/merge-requests/1/head
refs/merge-requests/1/merge

xargs -r -L1 git update-ref -d将grep的输出作为参数传递给git update-ref -dgit update-ref -d将删除有问题的引用。
我已经在PowerShell中完成了管道中的前三个步骤:
git show-ref | Foreach-Object {$_.split(' ')[1]} | Select-String 'pull|merge-requests'
该输出:

refs/merge-requests/1/head
refs/merge-requests/1/merge

如何完成最后一步,将这些结果传递给git update-ref -d?我认为将管道的输出作为参数传递给外部应用程序是一种常见的情况,但我还没有找到任何关于如何做到这一点的解释。

dojqjjoe

dojqjjoe1#

奥拉夫的评论为我指明了正确的方向:使用Foreach-Object。在我的案例中,以下方法奏效了:
git show-ref | Foreach-Object {$_.split(' ')[1]} | Select-String 'pull|merge-requests' | Foreach-Object {git update-ref -d $_}
最后一个Foreach-Object是secret酱料,其中$_表示通过管道的对象。您可以看到它作为参数传递给git update-ref -d。这种技术适用于任何接受参数的可执行文件。
顺便说一下,PowerShell命令可以通过使用开箱即用的别名来缩短:
git show-ref | % {$_.split(' ')[1]} | sls 'pull|merge-requests' | % {git update-ref -d $_}
但是,在脚本中,我倾向于使用完整的cmdlet名称,因为对于其他试图理解脚本的人来说,它们更容易识别。

相关问题