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

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

我该怎么做呢?


当前回答

以下是@wisbucky对Windows用户的回答:

for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d

我使用posh-git,不幸的是PS不喜欢裸体for,所以我创建了一个普通的'ol命令脚本,名为PruneOrphanBranches.cmd:

@ECHO OFF
for /f "tokens=1" %%i in ('git branch -vv ^| findstr ": gone]"') DO CALL :ProcessBranch %%i %1

GOTO :EOF

:ProcessBranch
IF /I "%2%"=="-d" (
    git branch %1 %2
) ELSE (
    CALL :OutputMessage %1
)
GOTO :EOF

:OutputMessage
ECHO Will delete branch [%1] 
GOTO :EOF

:EOF

不带参数调用它以查看列表,然后用“-d”调用它来执行实际的删除或对任何没有完全合并但无论如何都想删除的分支执行“-d”。

其他回答

Windows的解决方案

适用于Microsoft Windows Powershell:

Git结帐大师;Git远程更新源——prune;git branch -vv | Select-String -Pattern ": gone]" | % {$_.toString(). trim()。Split(" ")[0]} | % {git branch -d $_}

解释

Git签出主切换到主分支

Git远程更新来源——修剪远程分支

Git分支-vv获取所有分支的详细输出(Git引用)

Select-String -Pattern ": gone]"只获取已从远程删除的记录。

% {$_.toString()。Split(" ")[0]}获取分支名称

% {git branch -d $_}删除分支

修剪完成后,你可以使用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选项,所以在运行此命令时,它不会删除尚未合并到您所在分支中的分支。

使用@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就可以清理合并后不再需要的本地和远程分支。

删除所有没有更新到master的分支

git co master && git branch | sed s/\*/\ / | xargs git branch -d 2> /dev/null

Schleis的变种不适合我(Ubuntu 12.04),所以让我提出我的变种(清晰而闪亮:):

变体1(我更喜欢这个选项):

git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D 

版本2:

管制:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | awk '{print "git branch -D " $1}'

b.移除分支:

comm -23 <( git branch | grep -v "/" | grep -v "*" | sort ) <( git br -r | awk -F '/' '{print $2}' | sort ) | xargs git branch -D