如何在Powershell中使用Git for Windows迭代分支、过滤合并的分支并删除它们?
我已经尝试了一些研究,但是我找到的每一个答案都围绕着使用bash特定的命令,比如grep和xargs。Powershell没有相同的命令,所以这些命令对我不起作用。
然而,从那个研究中我发现git for-each-ref --format '%(refname:short)' refs/heads
可以显示所有本地分支,而git branch -d
会删除任何合并的分支。然而,将这两个命令连接在一起(git for-each-ref --format '%(refname:short)' refs/heads | git branch -d
)并不起作用,因为第一个命令的输出没有像我预期的那样通过管道传输。
5条答案
按热度按时间dba5bblo1#
经过一些发挥约,并进一步研究Powershell命令,我已经找到了一个解决方案!
虽然Powershell没有
xargs
命令,但它有一个类似的命令ForEach-Object
。这个命令允许我们处理git for-each-ref
输出的每一行。对于这个特定的问题,下面这行命令起到了作用:git for-each-ref --format '%(refname:short)' refs/heads | ForEach-Object {git branch $_ -d}
ForEach-Object
命令后面的花括号包含您要运行的命令,而$_
变量代表管道命令的每一行输出。希望这对其他新手Powershell/Git用户有帮助!
7eumitmz2#
git branch --merged | Select-String -Pattern '^[^\*].*' | ForEach-Object { git branch -d $_.ToString().Trim() }
操作步骤:
1.列出合并的分支:
git branch --merged
1.筛选出以 * 开头的分支(当前分支):
Select-String -Pattern '^[^\*].*'
1.删除分支
ForEach-Object { git branch -d $_.ToString().Trim() }
请注意,在#3中,我从输出中删除了一些空格:
$_.ToString().Trim()
。否则,我们将得到如下错误:oipij1gg3#
作为对
Liero
答案的补充,可以使用下面的正则表达式从将要删除的分支列表中排除特定的分支:因此,完整命令变为:
PS:如果分支名称包含非ascii字符,您可能需要在运行上面的命令之前切换Powershell的输出编码,例如:
4szc88ey4#
您也可以使用以下命令:
Andrei Fedotov的所有制作人员名单
0ve6wy6x5#
我无法在powershell 5.1版中使用S.Harris的上述解决方案。“if”语句没有捕获所需的模式。进行以下修改对我有效:
git for-each-ref --format '%()' refs/heads | ForEach-Object
{if($.contains("<some_string>")){git branch -d $}}
显然,powershell API被修改为包含
contains()
作为所有字符串see an example here的类方法。