解析GitHub批量删除除prod外所有Git分支的命令含义
命令逐段拆解
你拿到的是shell环境下执行的git分支批量清理脚本,本质是两个顺序执行的for循环,第一个做删除前预览,第二个执行实际删除操作,各部分作用如下:
基础语法提前说明
- 反引号
` `包裹的内容是shell的命令替换语法:shell会优先执行反引号内部的命令,把命令输出的文本结果作为外层语句的输入 for 变量 in 遍历列表; do 执行语句; done是shell的标准循环结构:- 你问的
$b就是循环自定义变量b的取值引用,循环每跑一轮,就会从遍历列表里取一个值赋给b,$b就代表当前轮次拿到的单个分支名
- 你问的
- 管道符
|的作用是把前一个命令的输出内容,直接作为后一个命令的输入内容传递,串联多个文本处理步骤
核心:待删除分支列表生成逻辑
反引号里的git branch --all | cut -c18- | grep -v prod是用来生成待清理分支列表的管道命令,逐段解释:
git branch --all:列出本地仓库记录的所有分支,包括本地分支、拉取到本地的远程分支记录。这个命令的默认输出格式里,每一行前面要么是两个空格(非当前选中分支),要么是*(当前选中分支,占2个字符),远程分支统一带remotes/origin/前缀,这部分固定占17个字符长度。cut -c18-:
cut是shell内置的文本截取工具,-c参数代表按字符位置做截取,18-的规则是「保留每行从第18个字符开始到行尾的全部内容」,刚好把前面的前缀、缩进/当前分支标记全部截掉,只留下纯分支名。注意:这个截取长度是和git默认输出格式绑定的,如果你改了git分支列表的输出配置,这个长度可能不准,这也是原命令先做预览的原因。
grep -v prod:grep是文本匹配工具,-v代表反向匹配,会过滤掉所有包含prod关键字的行,最终输出的列表就是所有名称不含prod的分支,也就是待清理的目标分支。
两个循环的作用
原命令里写了两次结构完全一致的for循环,作用分别是:
- 第一个循环
for b in[分支列表命令]; do echo $b; done:遍历所有待清理分支,把分支名逐行打印到终端,供你提前确认列表是否正确,避免误删。 - 第二个循环
for b in[分支列表命令]; do git push origin :$b $b; done:遍历所有待清理分支执行删除:git push origin :$b是git删除远程分支的标准写法:向远程仓库推送一个空引用到对应分支,等同于删除远程的该分支- 命令后面跟的
$b是本地分支名参数,执行时会同步删除本地的同名分支
风险提示:正式执行删除前,一定要先看第一个循环打印出来的分支列表,确认没有需要保留的分支再跑删除逻辑。如果你的仓库存在名称带
prod但不属于生产分支需要删除的场景,要调整grep的匹配规则,避免漏删。
内容的提问来源于stack exchange,提问作者rockon_d
相关产品推荐
相关产品推荐

