使用git远程修剪原点,我可以删除不在远程上的本地分支。

但是我还想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。

我该怎么做呢?


当前回答

修剪完成后,你可以使用git branch -r获取远程分支的列表。带有远程跟踪分支的分支列表可以使用git branch -vv检索。因此,使用这两个列表,您可以找到不在远程列表中的远程跟踪分支。

这一行应该做的把戏(需要bash或zsh,不会与标准的Bourne shell工作):

git fetch -p ; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -d

该字符串获取远程分支的列表,并通过标准输入将其传递给egrep。并过滤具有远程跟踪分支的分支(使用git branch -vv并过滤那些具有origin的分支),然后获得输出的第一列,这将是分支名称。最后将所有分支名称传递给delete branch命令。

由于它使用的是-d选项,所以在运行此命令时,它不会删除尚未合并到您所在分支中的分支。

其他回答

虽然迟到了,但是你可以使用——no-contains选项来避免在使用branch -merged时删除你的主分支

git branch --no-contains master --merged master | xargs git branch -d

使用@wisbucky答案的变体,我将以下内容作为~/的别名添加到~/。gitconfig文件:

pruneitgood = "!f() { \
    git remote prune origin; \
    git branch -vv | perl -nae 'system(qw(git branch -d), $F[0]) if $F[3] eq q{gone]}'; \
}; f"

这样,一个简单的git pruneitgood就可以清理合并后不再需要的本地和远程分支。

你可以通过一些简单的操作来做到这一点:

输出你所有的分支到一个临时文件:

git branch > branches.tmp

打开文件并删除分支以排除它们从本地删除(分支如develop/master/main/…) 通过cat命令将分支名称传递给xargs并删除分支:

cat branches.tmp | xargs git branch -D

不知道如何一次性完成,但是git git branch -d <branchname>只会在完全合并的情况下删除本地分支。注意小写的d。

git branch -D <branchname>(注意大写D)将删除本地分支,无论其合并状态如何。

除了Schleis的答案(它工作得很完美),它还可以集成到Visual Studio中,所以在VS中打开git repo时修剪本地分支非常简单。

您可以使用外部工具功能调用sh.exe (git bash)与特定的目录和命令。它位于工具>外部工具菜单选项中(在VS 2022 17.1.0中)。我使用的参数如下:

命令:{Path-To-Git-Installation-Location} \ bin \ sh.exe

参数:——cd=$(SolutionDir) -c "git fetch -p;Git branch -r | awk '{print $1}' | egrep -v -f /dev/ fg /0 <(Git branch -vv | grep origin) | awk '{print $1}' | xargs Git branch -d"

初始目录:$(SolutionDir)

Git修剪本地分支的截图

值得注意的是,只有当你在VS中打开的解决方案在git repo目录中时,这才会起作用。

最后提醒-这可以通过Visual Studio的按键绑定用户界面在设置>通用>键盘和搜索工具进行按键绑定。ExternalCommand[n],其中n是外部命令表中的位置,您有这个外部工具的位置(它们可以在工具>外部工具对话框中重新排序)。请看下面的截图。

键盘绑定外部工具命令