自动删除已经合并分支
branchclear-cli 发布了 🎉
现在使用branchclear-cli一键清除已经合并的分支吧!
git branch --merged|--no-merged [分支名]
参数解释
--merged
查询已经合并到当前分支的分支名--no-merged
查询未合并到当前分支的分支名- 分支名不加,则默认为当前分支
git branch --merged master
查看本地已经合并到 master 分支git branch -r --merged origin/master
查询所有已经合并到远程 master 分支的远程分支
grep和egrep
Linux
grep
命令用于查找文件里符合条件的字符串grep 参数 查询的字符串 文件或目录
egrep
相当于grep -E
代表使用正则查询文件或目录grep -v
显示不包含匹配文本的所有行egrep -v '(^\*|master)'
显示所有不包含以*开头和 master 的不包含*,就不会删除当前分支
egrep -v "(^\*|master|HEAD)
显示所有不包含以*开头和 master 以及 HEAD 的git branch -r 会有 HEAD 表示当前分支指向
Cut
cut
命令用于剪切origin/
- -d :自定义分隔符,默认为制表符。
- -f :与-d 一起使用,指定显示哪个区域。
cut -d '/' -f num
使用/作为分隔符,并且展示第二个
tr
Linux tr 命令用于转换或删除文件中的字符,但 tr 在此并不适用。
tr -d 'origin/'
是 将所有的 o
、 r
、 i
、 g
、 n
、 /
替换
sed
sed 's/正则/替换成的字符/g'
sed 's/origin\///g'
将文本中origin/
替换成空字符
xargs
linux xargs
是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。
xargs -n num
num 表示次数,表示命令在执行的时候一次用的 argument 的个数,默认是用所有的。
删除本地仓库失效的的远程分支
git remote prune origin
删除本地已经 merged 的分支
git branch --merged | egrep -v '(^\*|master)' |xargs git branch -D
注意:删除之前先确定删除分支
删除远程已经 merged 的分支
尝试 1:
git branch -r --merged origin/master |egrep -v '(master|HEAD)'|cut -b '/' -f 2|xargs -n 3 git push origin --delete
注意:分支名可能包含/,比如分支为 jxw/test。对远程分支 origin/jxw/test
cut -b '/' -f 2
会得到 jxw 和 test 两个结果。这个时候去删除 jxw 分支是不存在的。所以需使用特殊方法规避。优化方案:使用 sed 代替 cut
尝试二:
git branch -r --merged origin/master |egrep -v '(master|HEAD)'|sed 's/origin\///g'|xargs -n 3 git push origin --delete
有些分支删除报错,远程引用不存在。引出问题 git branch -r 查询的不是最新的。
git remote prune origin
删除失效远程分支成功
git remore prune origin|git branch -r --merged origin/babel-prd-6.5 |egrep -v '(master|HEAD)'|grep 'jxw'|sed 's/origin\///g'|xargs -n 3 git push origin --delete脚本实现
Package.json 文件
"scripts": {"clear:local": "bash clearBranch.sh local","clear:remote": "bash clearBranch.sh remote"}clearBranch.sh 文件
#!/bin/bash# 远程分支必须包含的字符,默认为jxwinc=$2include=${inc:='jxw'}case $1 in"local")echo '开始清除本地已经合并到master的分支(不包扩当前分支)'git branch --merged master | egrep -v '(^\*|master)' |xargs git branch -Decho '本地分支删除执行完毕';;"remote")echo '开始清除远程已经合并到master的分支'git remote prune originecho 'git remote prune origin 删除本地远程失效分支成功'echo "即将删除以下远程分支"branch=`git branch -r --merged origin/master |egrep -v '(master|HEAD)'|grep $include|sed 's/origin\///g'`echo $branchecho '输入y删除,n或任意字符取消'read $REPLYif [ "$REPLY" == 'Y' -o "$REPLY" == 'y' ];thenecho $branch |xargs -n 3 git push origin --deleteecho '远程分支删除执行完毕'elseecho '取消删除远程分支'exit 0fi;;*)exit 0;;esac