使用git remote prune origin
可以删除本地不再追踪的远程分支。
但是我也想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。
我应该怎么做?
使用git remote prune origin
可以删除本地不再追踪的远程分支。
但是我也想删除从这些远程分支创建的本地分支(检查它们是否未合并会很好)。
我应该怎么做?
git branch > branches.tmp
develop
/master
/main
/...
等分支)cat
命令将分支名称传递给xargs
,然后删除这些分支:cat branches.tmp | xargs git branch -D
不确定如何一次性完成所有操作,但是git git branch -d <分支名>
仅在分支完全合并时才会删除本地分支。请注意小写的 d。
git branch -D <分支名>
(请注意大写的 D)将无论其是否已合并都会删除本地分支。
git branch --merged master | grep -v "\* master" | xargs -n 1 git branch -d
Git Clean:删除已合并的分支,包括命令细节说明
Schleis的变体对我不起作用(Ubuntu 12.04),所以让我提出我自己的(清晰明了:))变体:
选项1(我更喜欢这个选项):
git for-each-ref --format='%(refname:short) %(upstream)' refs/heads/ | awk '$2 !~/^refs\/remotes/' | xargs git branch -D
变体2:
a. 模拟运行:
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
git fetch -p
git branch --v | ? {$_.contains('[gone]')} | % {$_.trim().split()[0].trim()} | % {git branch -D $_}
git branch --v
命令列出你的分支,其中关键信息包括 [gone]
状态? {$_.contains('[gone]')}
如果存在 [gone]
,返回 True% {$_.trim().split()[0].trim()}
只显示分支名% {git branch -D $_}
强制删除本地分支,即使未合并如果要避免删除未合并的分支,请将选项 -D
改为 -d
并手动处理。
我使用 git 2.21.0,这个方法对我有效 - 它会删除本地跟踪分支,这些分支已经合并到 HEAD
中,并且之前曾在 push 时使用了 --set-upstream
(我使用 push.default=upstream
,因为它与多个远程仓库最兼容),而且那个上游分支已被 fetch --prune
删除(或者如果 git 配置中设置了 fetch.prune=true
,则隐式删除):
git branch -vv --merged | grep ': gone]' | awk '{print $1}' | xargs git branch -d
--merged
和-d
使得这是一个非常“安全”的删除操作。更加激进的版本可以省略--merged
并使用-D
。xargs
之前的命令将返回*
而不是分支名称。我的建议是使用git checkout master; git branch -vv --merged | grep ': gone]' | awk '{print $1}' | xargs git branch -d
- Tian以下是git branch --merged master | grep -v '^[ *]*master$' | xargs git branch -d
的Powershell版本:
git branch --merged master | %{ if($_ -notmatch '\*.*master'){ git branch -d "$($_.Trim())" }}
当你在主分支上时,这将删除已合并到主分支的任何本地分支。
使用git checkout master
进行切换。
for /f "tokens=1" %i in ('git branch -vv ^| findstr ": gone]"') DO git branch %i -d
我使用posh-git,不幸的是,PowerShell不喜欢裸用的for
,所以我创建了一个名为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”参数删除所有未完全合并但仍想删除的分支。
findstr
中的:
或:
(带空格)导致它每次都匹配所有内容 - 我差点删除了主分支。然而,使用正则表达式可以正常工作:git branch -vv ^| findstr /R " \[origin/[0-9]+: gone\] "
。 - Josh根据以上答案,我得出了这个一行代码的解决方案:
git remote prune origin; git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | 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
,可以清理掉那些在合并之后不再需要的本地和远程分支。
npx git-removed-branches
(干运行) 或npx git-removed-branches --prune
(真实运行)。详细信息请参见以下答案。 - Cristian Diaconescu