是否有一种简单的方法可以删除所有远程对等分支不再存在的跟踪分支?

例子:

分支机构(本地和远程)

主人原始/主起源/bug-fix-a起源/bug-fix-b起源/bug-fix-c

在本地,我只有一个主分支。现在我需要处理bug-fix-a,所以我检查它,处理它,并将更改推到远程。接下来,我对bug-fix-b做同样的操作。

分支机构(本地和远程)

主人bug-fix-abug-fix-b型原始/主起源/bug-fix-a起源/bug-fix-b起源/bug-fix-c

现在我有本地分支机构master,bug-fix-a,bug--fix-b。主分支维护者将把我的更改合并到主分支中,并删除他已经合并的所有分支。

因此,当前状态为:

分支机构(本地和远程)

主人bug-fix-abug-fix-b型原始/主起源/bug-fix-c

现在我想调用一些命令来删除分支(在本例中为bug-fix-a、bug-fix-b),这些分支在远程存储库中不再表示。

它类似于现有命令git remote prune origin,但更类似于git local prune origin。


当前回答

对于Windows或其他不想/不会编写命令行脚本或不想使用PowerShell的人来说,这是一个更简单的解决方案。

将分支列表转储到文件中gitbranch>branches.txt(或git branch--merged>branches.txt,如果您是腰带和吊带类型;gitbranch-d将防止删除未合并的分支)

在编辑器中打开该文件并合并所有行(我使用了升华文本,所以突出显示所有行并按ctrl+j)

在分支列表前面添加gitbranch-d。

全选、复制并粘贴(在windows cmd窗口中单击鼠标右键)到命令行中。

其他回答

我喜欢使用管道,因为它使命令更容易阅读。

如果您想删除除master之外的所有分支,这是我的解决方案。

git branch | grep -v master | xargs -n 1 git branch -D

要删除符合条件的其他分支,请修改第一个和第二个块。

git branch --merged | grep feature_name | xargs -n 1 git branch -D

这将删除除本地主引用和当前使用的引用之外的所有合并的本地分支:

git branch --merged | grep -v "*" | grep -v "master" | xargs git branch -d

这将删除所有已从“源”引用的远程存储库中删除的分支,但仍在“远程/源”中本地可用。

git remote prune origin

虽然上面的答案涵盖了如何手动修剪树枝,但这个答案增加了解决这一问题的自动化。git现在有了一个新设置,可以在每次提取操作中删除不再位于远程的过时分支。这很好,因为我们不再需要在每次删除分支时手动调用远程prune(git pull也调用git fetch)。

为每次提取启用修剪行为

要在全局配置中启用此功能,请执行以下操作:

git config --global fetch.prune true

让事情自动发生意味着你可以忘记在新机器上添加此设置。它只是起作用。

对特定远程设备上的每次提取启用修剪行为

git config --global remote.<name>.prune true

本地自动修剪

我们也可以在不使用--global标志的情况下对局部修剪应用相同的命令。

.git配置

上面的命令适用于global和local.gitconfig,如下所示:

...
[fetch]
    prune = true

我可以建议将其添加到一个可靠的配置中或添加到您的dotfiles存储库(.gitconfig)中,以便将来自动进行设置。

配置设置在每次提取时调用以下命令:

git remote prune <remote name>

总结

要将引用作为正常工作流的一部分进行删减而不需要记住运行,请全局或远程设置fetch.prune<name>.在配置中对每个远程进行修剪。请参阅git-config。

根据以上信息,这对我来说很有效:

git br -d `git br -vv | grep ': gone] ' | awk '{print $1}' | xargs`

它将删除远程上所有带有“:gone]”的本地分支。

这些答案中的大多数实际上并没有回答最初的问题。我做了大量的挖掘,这是我找到的最干净的解决方案。这是一个稍微更彻底的答案:

查看默认分支。通常是git结账大师运行git fetch-p&&git branch-vv|awk'/:gone]/{print$1}'|xargs git branch-d

说明:

通过修剪跟踪分支,然后在gitbranch-vv中删除显示它们已“消失”的本地分支。

笔记:

如果您的语言设置为英语以外的语言,则需要更改为相应的单词。仅本地的分支将不会被触摸。已在远程删除但未合并的分支将显示通知,但不会在本地删除。如果您想删除这些,也可以将-d更改为-d。