如何在Git中使用PowerShell删除所有合并的本地分支

uqjltbpv  于 2022-12-10  发布在  Git
关注(0)|答案(5)|浏览(165)

如何在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)并不起作用,因为第一个命令的输出没有像我预期的那样通过管道传输。

dba5bblo

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用户有帮助!

7eumitmz

7eumitmz2#

git branch --merged | Select-String -Pattern '^[^\*].*' | ForEach-Object { git branch -d $_.ToString().Trim() }
操作步骤:
1.列出合并的分支:git branch --merged

feature/branch1
  feature/branch2
* master

1.筛选出以 * 开头的分支(当前分支):Select-String -Pattern '^[^\*].*'

feature/branch1
  feature/branch2

1.删除分支ForEach-Object { git branch -d $_.ToString().Trim() }
请注意,在#3中,我从输出中删除了一些空格:$_.ToString().Trim()。否则,我们将得到如下错误:

error: branch '  feature/yourbranch' not found.
oipij1gg

oipij1gg3#

作为对Liero答案的补充,可以使用下面的正则表达式从将要删除的分支列表中排除特定的分支:

'^(?!.*(master|development)).*$'

因此,完整命令变为:

git branch --merged | Select-String -Pattern '^(?!.*(master|development|main)).*$' | ForEach-Object { git branch -d $_.ToString().Trim() }

PS:如果分支名称包含非ascii字符,您可能需要在运行上面的命令之前切换Powershell的输出编码,例如:

[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
4szc88ey

4szc88ey4#

您也可以使用以下命令:

git branch | %{ $_.Trim() } | ?{ $_ -ne 'master' } | %{ git branch -D $_ }

Andrei Fedotov的所有制作人员名单

0ve6wy6x

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的类方法。

相关问题