【问题标题】:How to delete all merged local branches in Git with PowerShell如何使用 PowerShell 删除 Git 中所有合并的本地分支
【发布时间】:2018-07-04 10:27:22
【问题描述】:

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

【问题讨论】:

  • git branch --merged master 将为您提供合并到master 的分支列表(包括master 本身)。也许你可以在这个基础上工作,将它传送到git branch -d。我不知道 Powershell,所以我不会在这个问题上提供任何帮助。

标签: git powershell


【解决方案1】:

经过一番尝试,以及对 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 用户!

【讨论】:

  • 不错!您可能希望在管道之前添加 --merged 以将其限制为合并分支
  • 我添加了一个检查以排除develop和master也被删除...git for-each-ref --format '%(refname:short)' refs/heads --merged | ForEach-Object { If("develop","master" -notcontains $_) { git branch $_ -d } }
  • 哦,很好@unforgiven1987,正是我想做的......得分! ?
【解决方案2】:

git branch --merged | Select-String -Pattern '^[^\*].*' | ForEach-Object { git branch -d $_.ToString().Trim() }

步骤:

  1. 列出合并的分支:git branch --merged

      feature/branch1
      feature/branch2
    * master
    
  2. 过滤掉以 * 开头的那些(当前分支):Select-String -Pattern '^[^\*].*'

      feature/branch1
      feature/branch2
    
  3. 删除分支ForEach-Object { git branch -d $_.ToString().Trim() }

请注意,在 #3 中,我从输出中删除了一些空格:$_.ToString().Trim()。 否则我们会得到如下错误:

error: branch '  feature/yourbranch' not found.

【讨论】:

    【解决方案3】:

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

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

    因此完整的命令变为:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 2012-05-23
      • 2011-09-01
      • 2012-09-18
      • 1970-01-01
      • 2020-11-13
      • 2016-01-09
      • 1970-01-01
      相关资源
      最近更新 更多